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)
我真的很困惑为什么这没有检测到重复项,有什么想法吗?
提前致谢
只要您的输入文件有重复项,您就会得到该信息。理论上,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)
归档时间: |
|
查看次数: |
4560 次 |
最近记录: |