Sql server 合并语句错误调试

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

在这种情况下,我有一个包含merge语句的存储过程。该过程从表A中获取数据,并使用merge语句更新表B中的某些记录。该过程工作正常,但偶尔会出现表A中存在重复记录的情况。存储过程位于设置了错误通知的包中,该包在作业中运行,并给出以下错误。我们有什么方法可以调试它吗?像存储过程中的某些地方,如果出现错误,则将源数据插入表中?欢迎您的任何意见

谢谢

错误:

失败,出现以下错误:“合并语句试图 多次更新或删除同一行。当 目标行与多个源行匹配。不能使用合并语句 多次更新/删除目标表的同一行。优化 ON子句以确保目标行最多与一个源行匹配, 或使用GROUP BY子句对源行进行分组。“。可能的 失败原因:查询有问题,未设置“ResultSet”属性 正确,参数设置不正确,或未建立连接 没错


您可以在合并过程的开头添加如下内容:

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 |
+----+----------+----------+----+-----+---------------------+