Sql server 合并语句错误调试
在这种情况下,我有一个包含merge语句的存储过程。该过程从表A中获取数据,并使用merge语句更新表B中的某些记录。该过程工作正常,但偶尔会出现表A中存在重复记录的情况。存储过程位于设置了错误通知的包中,该包在作业中运行,并给出以下错误。我们有什么方法可以调试它吗?像存储过程中的某些地方,如果出现错误,则将源数据插入表中?欢迎您的任何意见 谢谢 错误: 失败,出现以下错误:“合并语句试图 多次更新或删除同一行。当 目标行与多个源行匹配。不能使用合并语句 多次更新/删除目标表的同一行。优化 ON子句以确保目标行最多与一个源行匹配, 或使用GROUP BY子句对源行进行分组。“。可能的 失败原因:查询有问题,未设置“ResultSet”属性 正确,参数设置不正确,或未建立连接 没错Sql server 合并语句错误调试,sql-server,tsql,stored-procedures,merge,sql-server-2012,Sql Server,Tsql,Stored Procedures,Merge,Sql Server 2012,在这种情况下,我有一个包含merge语句的存储过程。该过程从表A中获取数据,并使用merge语句更新表B中的某些记录。该过程工作正常,但偶尔会出现表A中存在重复记录的情况。存储过程位于设置了错误通知的包中,该包在作业中运行,并给出以下错误。我们有什么方法可以调试它吗?像存储过程中的某些地方,如果出现错误,则将源数据插入表中?欢迎您的任何意见 谢谢 错误: 失败,出现以下错误:“合并语句试图 多次更新或删除同一行。当 目标行与多个源行匹配。不能使用合并语句 多次更新/删除目标表的同一行。优化 ON
您可以在合并过程的开头添加如下内容:
if exists (
select 1
from a
group by a.OnColumn
having count(*)>1
)
begin;
insert into merge_err (OnColumn, OtherCol, rn, cnt)
select
a.OnColumn
, a.OtherCol
, rn = row_number() over (
partition by OnColumn
order by OtherCol
)
, cnt = count(*) over (
partition by OnColumn
)
from a
raiserror( 'Duplicates in source table a', 0, 1)
return -1;
end;
测试设置:
虚拟程序:
create procedure dbo.Merge_A_into_B as
begin
set nocount, xact_abort on;
if exists (
select 1
from a
group by a.OnColumn
having count(*)>1
)
begin;
insert into merge_err (OnColumn, OtherCol, rn, cnt)
select
a.OnColumn
, a.OtherCol
, rn = row_number() over (
partition by OnColumn
order by OtherCol
)
, cnt = count(*) over (
partition by OnColumn
)
from a
raiserror( 'Duplicates in source table a', 0, 1)
return -1;
end;
/*
merge into b
using a
on b.OnColumn = a.OnColumn
...
--*/
end;
go
执行测试程序并检查错误表:
exec dbo.Merge_A_into_B
select *
from merge_err
where cnt > 1
结果:
+----+----------+----------+----+-----+---------------------+
| id | OnColumn | OtherCol | rn | cnt | ErrorDate |
+----+----------+----------+----+-----+---------------------+
| 1 | 1 | a | 1 | 2 | 05.02.2017 17:22:39 |
| 2 | 1 | b | 2 | 2 | 05.02.2017 17:22:39 |
+----+----------+----------+----+-----+---------------------+
在合并之前查看表A中的行的差异或聚合,以便连接键最终每个都标识一个唯一的行。。
+----+----------+----------+----+-----+---------------------+
| id | OnColumn | OtherCol | rn | cnt | ErrorDate |
+----+----------+----------+----+-----+---------------------+
| 1 | 1 | a | 1 | 2 | 05.02.2017 17:22:39 |
| 2 | 1 | b | 2 | 2 | 05.02.2017 17:22:39 |
+----+----------+----------+----+-----+---------------------+