MySQL REPLACE TO의 SQL Server 2005 구현 대상
MySQL은 매우 유용하지만 독자적인 기능을 갖추고 있습니다.REPLACE INTOSQL 명령어
SQL Server 2005에서 쉽게 에뮬레이트할 수 있습니까?
새 트랜잭션 시작, 수행Select()그리고 나서UPDATE또는INSERT그리고.COMMIT특히 어플리케이션에서 실행할 때는 항상 조금 번거롭기 때문에 항상 두 가지 버전의 스테이트먼트를 유지합니다.
이러한 기능을 SQL Server 2005에 구현하기 위한 쉽고 보편적인 방법이 있을까요?
이것은 MSSQL(블로그에서 불평)에 대해 나를 짜증나게 하는 것이다.MSSQL을 지원했으면 좋겠다upsert.
@Dillie-O의 코드는 이전 SQL 버전(+1 투표)에서는 좋은 방법이지만, 여전히 기본적으로 2개의 I/O 작업입니다.exists그 다음에update또는insert)
기본적으로 이 게시물에 조금 더 나은 방법이 있습니다.
--try an update
update tablename
set field1 = 'new value',
field2 = 'different value',
...
where idfield = 7
--insert if failed
if @@rowcount = 0 and @@error = 0
insert into tablename
( idfield, field1, field2, ... )
values ( 7, 'value one', 'another value', ... )
이렇게 하면 업데이트일 경우 IO 작업이 1회, 삽입일 경우 IO 작업이 2회로 줄어듭니다.
MS Sql2008mergeSQL:2003 표준:
merge tablename as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert ( idfield, field1, field2, ... )
values ( 7, source.field1, source.field2, ... )
현재는 입출력 조작이 1회밖에 되지 않지만, 코드가 엉망입니다.
고객이 찾고 있는 기능은, 종래의 UPSERT라고 불립니다.적어도 그 이름을 아는 것이 당신이 찾고 있는 것을 찾는 데 도움이 될 것이다.
SQL Server 2005에는 이 작업을 수행하는 좋은 방법이 없는 것 같습니다.2008 에서는, http://www.databasejournal.com/features/mssql/article.php/3739131 또는 http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx 에 나타나 있듯이, 이것을 실현하기 위해서 사용할 수 있는 MERGE 스테이트먼트가 도입되고 있습니다.
Marge는 2005년 베타판에서는 사용할 수 있었지만 최종 릴리즈에서는 삭제되었습니다.
상승/합병하는 것은 ...의 취지의 무엇인가이다.
IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
UPDATE [Table] SET...
ELSE
INSERT INTO [Table]
그래서 이 기사들과 의사 코드들의 조합이 상황을 움직이게 할 수 있기를 바랍니다.
나는 이 문제에 대해 블로그에 글을 썼다.
결론적으로 저렴한 업데이트를 원하는 경우, 그리고 동시 사용에 대해 안전한 업데이트를 원하는 경우 다음을 시도해 보십시오.
update t
set hitCount = hitCount + 1
where pk = @id
if @@rowcount < 1
begin
begin tran
update t with (serializable)
set hitCount = hitCount + 1
where pk = @id
if @@rowcount = 0
begin
insert t (pk, hitCount)
values (@id,1)
end
commit tran
end
이렇게 하면 업데이트에 대한 작업이 1회, 삽입에 대한 작업이 최대 3회까지 가능합니다.따라서 일반적으로 업데이트를 하는 경우에는 이 옵션이 안전하고 저렴한 옵션입니다.
또한 동시에 사용하기에 안전하지 않은 것은 사용하지 않도록 주의하겠습니다.운영 환경에서 기본 키 위반이나 중복 행을 쉽게 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/234/sql-server-2005-implementation-of-mysql-replace-into
'programing' 카테고리의 다른 글
| MariaDB 및 1064 오류 (0) | 2022.09.26 |
|---|---|
| 문자열 내의 모든 문자에 각 루프를 적용하려면 어떻게 해야 하나요? (0) | 2022.09.26 |
| PHPUnit 모의 개체에서 두 번째 매개 변수를 테스트하는 방법 (0) | 2022.09.26 |
| mariaDB 클라이언트를 MySQL DB와 통합하는 데 문제가 있습니다. (0) | 2022.09.26 |
| htaccess를 통해서만 PHP에서 오류 표시 활성화 (0) | 2022.09.26 |