UPSERT-MERGE 또는 @@ rowcount에 대한 더 나은 대안이 있습니까? [닫은]


14

UPSERT 개념과 유사한 T-SQL 명령이 발생했는지 궁금합니다. 옵션 (1) 또는 (2)를 사용하여 INSERT | UPDATE 작업을 수행하면 지나치게 복잡하고 오류가 발생하기 쉽습니다.

객관적인

원하는 레코드 (이 경우 employee_id 1)가 동일한 쿼리를 기본적으로 두 번 작성하지 않고도 최신 상태로 유지합니다.

문맥

  • 테이블 이름 : 직원
  • 직원 ID : 기본 키가 있으며 ID 속성이 true로 설정됩니다.

옵션

  1. SQL UPDATE 실행 ... @@ rowcount = 0 확인 및 @@ error = 0 ... 필요한 경우 SQL INSERT 실행

    • con : 효과적으로 같은 쿼리를 삽입으로 한 번, 업데이트로 한 번 작성해야합니다.
    • 죄수 : 더 많은 코드 = 더 많은 시간 입력
    • 죄수 : 더 많은 코드 = 더 많은 오류 공간

/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "@@ rowcount를 사용하여 업데이트"

  1. SQL MERGE를 실행
    • con : 효과적으로 같은 쿼리를 삽입으로 한 번, 업데이트로 한 번 작성해야합니다.
    • 죄수 : 더 많은 코드 = 더 많은 시간 입력
    • 죄수 : 더 많은 코드 = 더 많은 오류 공간

http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL 병합"

  1. SQL UPSERT 실행 (기능이 존재하지 않음)
    • pro : 데이터와 테이블의 관계를 한 번만 정의합니다 (SQL Server가 INSERT인지 UPDATE인지에 대해 걱정하도록합니다)
    • 찬성 : 적은 코드 = 빠른 구현
    • 찬성 : 적은 코드 = 낮은 확률

UPSERT 예

UPSERT 직원 (employee_id, employee_number, job_title, first_name, middle_name, surname, modified_at) 값 (1, '00 -124AB37 ','Manager ','John ','T ','Smith ', GetDate ());

  • employee_id 1이 존재하지 않는 경우 : MS SQL이 INSERT 문을 실행합니다.
  • employee_id 1이 존재하는 경우 : MS SQL이 실행되고 UPDATE 문

4
이것은 Microsoft의 기능 요청처럼 보입니다. 여기서 누군가 해결할 수있는 것은 아닙니다. Microsoft가 제시 한 솔루션은 MERGE입니다. 이것이 유연하고 강력하지 않은 경우 아직 존재하지 않는 다른 솔루션이 필요합니다.
Aaron Bertrand

3
제 생각 MERGE에는 간단하고 유연하며 SQL 표준의 일부이기도합니다. 실제 구현 MERGE및 기타 UPSERT구현의 문제점 은 잠재적 인 잠금 에스컬레이션 또는 심지어 교착 상태와도 관련이 있으며 구문과는 관련이 없습니다.
a1ex07

궁금한 점이 있으면 언제든지 문의하십시오. 작성된 바와 같이 이것은 기본적으로 MERGESQL Server 구현에 대한 열광 입니다.
JNK

좋은 질문-서버가 삽입 또는 업데이트가 필요한지에 대해 걱정하는 UPSERT 문이 본질적으로 있습니까? MERGE가 "UPSERT"구현에 대해 논리적으로 기대하는 것을 충족시키지 못한다는 데 동의합니다. MS가 이런 식으로 구현하기로 결정했다면 내 질문은 다음과 같습니다. 약점 또는 구현이 불가능했을 수도 있습니다. 귀하가 원하는 구문을 구현하려고 시도한 적이 있습니까?
youcantryreachingme

답변:


14

나는 이것에 대한 간단한 대답은 아니오라고 생각합니다. MERGE보다 복잡한 UPSERT논리에 대한 Microsoft의 대답이었습니다 . 그리고 최악의 접근 방식조차 나열하지 않았습니다.

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

방금 입에 약간의 타이핑을했지만 실제로 가장 많이 본 것입니다.

어쨌든 MERGE유연하거나 강력하지 않은 경우 http://connect.microsoft.com/sql/ 에서 Microsoft에 기능 요청을 제출하고 비즈니스 사례를 철저히 설명 하는 것이 좋습니다 . 에 대해 제안 된 구문의 실제 장점을 고수하는 MERGE한 내 투표가 있습니다. "오류가 발생하기 쉬운"부분에 너무 많이 매달리면 구매할 가능성이 적습니다. 왜 그렇습니까? 당신은 어떤 진술도 뚱뚱하게 할 수 있기 때문에.

즉, 여기 누군가가 당신을 위해 특별히 할 수있는 일은 없다고 생각합니다. 다음과 같은 잠재적 인 문제를 조사해야합니다 MERGE.

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/


2
고마워 Aaron. MSDN의 T-SQL 설명서를 살펴보면서 원하는 것을 찾을 수 없었습니다. 내가 뭔가를 놓친 경우에 버리겠다고 생각했습니다. MERGE 문은 특정 상황에서 의미가 있지만, 간단한 저장 작업을 위해 "손톱에 두드리는 망치"솔루션이라고 생각할 수는 없습니다. 아마도 프로그래머 모자를 쓰고 DBA Fedora를 착용해야 할 것입니다. 시간을내어 의견을 보내 주셔서 감사합니다.
Pressacco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.