Sql-Server
合併問題 SQL Server
我正在嘗試創建一個過程,該過程將從臨時表中獲取值,並將它們載入到另一個表中。第二個表在其三列中具有復合唯一約束(不包括主鍵)我正在使用合併語句來嘗試處理上傳,並不斷收到錯誤消息,提示 Msg 2627, Level 14, State 1, Line 13
Violation of UNIQUE KEY constraint 'IX_table'. Cannot insert duplicate key in object 'dbo.table'. The duplicate key value is (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
我真的很困惑為什麼這沒有檢測到重複,有什麼想法嗎?
提前致謝
每當您的輸入文件有重複項時,您都會得到它。理論上,MERGE 命令是批量執行所有操作,因此如果您在輸入數據中有多次相同的行,它將多次嘗試將其插入到輸出表中,從而導致錯誤。對您的輸入文件進行重複數據刪除或在 MERGE 開始時使用 CTE 為您處理它。
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'); WITH dedupe AS (SELECT DISTINCT str1, str2, str3 FROM #TempTable) MERGE dbo.[table] AS t USING dedupe 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