임시 테이블에서 값을 가져 와서 다른 테이블로로드하는 프로 시저를 만들려고합니다. 두 번째 테이블에는 세 개의 열 (기본 키 포함 안함)에 복합 고유 제한 조건이 있습니다. 병합 명령문을 사용하여 업로드를 처리하고 오류가 계속 발생합니다.병합 문제 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
난 정말 왜이 감지하지 못하고 있음을 중복으로 같은 아이디어를 혼동하고있어 (이름 변경, 임시 테이블에 삽입이 변경 포함)입니까? 당신은 같은 문에서 같은 행에 여러 번 업데이트하는 사전
USING 문 다음에 조건이 충족되어서는 안됩니다. 그래서 그것은 INSERT로 옮겨 가고 - 복제물을 삽입하려고합니다. –
MERGE는 레코드별로 처리되지 않고 집합으로 처리됩니다. 소스 레코드와의 비교를 위해 조작의 시작 부분에서 목표 테이블의 스 냄샷이 있습니다. 소스 데이터에 중복 된 키가있는 경우 (여기), 둘 다 NOT MATCHED로 분류됩니다. 행 중 하나가 INSERT를 일으킨 다음 두 번째 행이 업데이트를 일으키는 것과 같은 것은 아닙니다. 원본 데이터를 모르고 중복 자료가있을 가능성이있는 경우 원본 데이터 쿼리에서 SELECT DISTINCT를 사용하십시오. –
업데이트가 의미가 없습니다. 동일한 값으로 갱신됩니다. – usr