2014-10-23 2 views
1

임시 테이블에서 값을 가져 와서 다른 테이블로로드하는 프로 시저를 만들려고합니다. 두 번째 테이블에는 세 개의 열 (기본 키 포함 안함)에 복합 고유 제한 조건이 있습니다. 병합 명령문을 사용하여 업로드를 처리하고 오류가 계속 발생합니다.병합 문제 SQL Server

메시지 2627, 수준 14 , 상태 1, 줄 13
UNIQUE KEY 제약 조건 'IX_table'을 위반했습니다.
개체 'dbo.table'에 중복 키를 삽입 할 수 없습니다. 중복 키 값은 (aaa, aaa, aaa)입니다.

나는 병합 성명서를 사용하고있는 이유가 정확히 이런 일이 일어나지 않도록하기 때문에 정말로 혼란 스럽습니다. 다음 절차의 관련 부분은

create table #TempTable(Id int 
         , str1 varchar(3) 
         , str2 varchar(15) 
         , str3 varchar(10)) 

INSERT INTO #TempTable 
      (str1 
      ,str2 
      ,str3) 
    VALUES 
      ('aaa','aaa','aaa'), ('bbb', 'bbb', 'bbb'), ('aaa','aaa','aaa') 

MERGE dbo.table AS t 
    USING #TempTable AS s 
    ON (t.str1 = s.str1 
    AND t.str2 = s.str2 
    AND t.str3 = s.str3) 
    WHEN MATCHED THEN 
     UPDATE SET t.str1 = s.str1 
    WHEN NOT MATCHED THEN 
     INSERT (str1, str2, str3) 
     VALUES (s.str1, s.str2, s.str3); 

drop table #TempTable 

난 정말 왜이 감지하지 못하고 있음을 중복으로 같은 아이디어를 혼동하고있어 (이름 변경, 임시 테이블에 삽입이 변경 포함)입니까? 당신은 같은 문에서 같은 행에 여러 번 업데이트하는 사전

+0

USING 문 다음에 조건이 충족되어서는 안됩니다. 그래서 그것은 INSERT로 옮겨 가고 - 복제물을 삽입하려고합니다. –

+2

MERGE는 레코드별로 처리되지 않고 집합으로 처리됩니다. 소스 레코드와의 비교를 위해 조작의 시작 부분에서 목표 테이블의 스 냄샷이 있습니다. 소스 데이터에 중복 된 키가있는 경우 (여기), 둘 다 NOT MATCHED로 분류됩니다. 행 중 하나가 INSERT를 일으킨 다음 두 번째 행이 업데이트를 일으키는 것과 같은 것은 아닙니다. 원본 데이터를 모르고 중복 자료가있을 가능성이있는 경우 원본 데이터 쿼리에서 SELECT DISTINCT를 사용하십시오. –

+0

업데이트가 의미가 없습니다. 동일한 값으로 갱신됩니다. – usr

답변

0

감사합니다. DML은 세트 기반이라는 것을 이해하십시오. 행은 차례로 적용되지 않습니다. 이것은 비효율적 인 실행 계획을 강요하고 SQL의 정신에 있지 않습니다.

SQL Server에서 중복 업데이트가 정의 된 방법을 잘 모르겠습니다. 나는 SQL 서버가 적어도 하나의 중복 업데이트가 발생한다고 정의한다. 어느 것이 통과하는지는 불분명하다.

여기서는 삽입물을 다루고 있습니다. 같은 행을 두 번 삽입하고 있습니다. 쓰기는 쓰기가 실행되기 전에 완전히 계산됩니다. 그렇기 때문에 두 개의 인서트가 대기 중입니다.