programing

MySQL REPLACE TO의 SQL Server 2005 구현 대상

sourcejob 2022. 9. 26. 21:59
반응형

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

반응형