Sql-Server

合併問題 SQL Server

  • October 23, 2014

我正在嘗試創建一個過程,該過程將從臨時表中獲取值,並將它們載入到另一個表中。第二個表在其三列中具有復合唯一約束(不包括主鍵)我正在使用合併語句來嘗試處理上傳,並不斷收到錯誤消息,提示 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

引用自:https://dba.stackexchange.com/questions/80975