合并问题 SQL Server

Jar*_*rth 5 sql-server merge unique-constraint

我正在尝试创建一个过程,该过程将从临时表中获取值,并将它们加载到另一个表中。第二个表在其三列(不包括主键)上有一个复合唯一约束我正在使用合并语句尝试处理上传,并不断收到错误消息,提示消息 2627,级别 14,状态 1,第 13 行

Violation of UNIQUE KEY constraint 'IX_table'. 
Cannot insert duplicate key in object 'dbo.table'. The duplicate key value is (aaa, aaa, aaa).
Run Code Online (Sandbox Code Playgroud)

我真的很困惑,因为我使用合并语句的全部原因是为了防止这种情况发生。这是过程的相关部分(名称已更改,并且对临时表的插入已更改)

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
Run Code Online (Sandbox Code Playgroud)

我真的很困惑为什么这没有检测到重复项,有什么想法吗?

提前致谢

Ken*_*her 4

只要您的输入文件有重复项,您就会得到该信息。理论上,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
Run Code Online (Sandbox Code Playgroud)