Sql server SQL Server合并:“当源不匹配时”

Sql server SQL Server合并:“当源不匹配时”,sql-server,merge,Sql Server,Merge,我在staging表中有超过一百万行。每个月暂存表都会获取行,插入主表后,暂存表中的这些行将被删除 还有另一个名为allchanges的表,它跟踪对主表进行的所有更新,例如month1地址更改,month2-电话更改,因此所有更改都有2条记录,而主表只有一条更新记录 我在匹配时、目标不匹配时和源不匹配时使用合并 因为我一次只选择2行,所以当源不匹配时,在第二次迭代中,前2行的活动设置为零。我怎样才能克服这个问题???我不确定我是否完全理解你的问题。在第一次迭代中会发生什么?在第一次迭代中,由于主

我在staging表中有超过一百万行。每个月暂存表都会获取行,插入主表后,暂存表中的这些行将被删除

还有另一个名为allchanges的表,它跟踪对主表进行的所有更新,例如month1地址更改,month2-电话更改,因此所有更改都有2条记录,而主表只有一条更新记录

我在匹配时、目标不匹配时和源不匹配时使用合并


因为我一次只选择2行,所以当源不匹配时,在第二次迭代中,前2行的活动设置为零。我怎样才能克服这个问题???

我不确定我是否完全理解你的问题。在第一次迭代中会发生什么?在第一次迭代中,由于主控中没有记录,所以当目标和插入不匹配时,它会转到主控中。第二次迭代,它将获取下一个前2条记录,这两条记录在源不匹配的情况下。如果我不使用TOP n记录,就不会发生这种情况。
WITH  NewAndChanged
AS    (SELECT   TOP 2 stg.[EmpName],
                       stg.[EmpNumber],

       FROM     staging AS stg
       ORDER BY stg.[EmpNumber]
       EXCEPT
       SELECT   TOP 2 mas.[EmpName],
                       mas.[EmpNumber],

       FROM    [Master] AS mas
       ORDER BY mas.EmpNumber)
MERGE INTO [Master]
 AS Target
USING NewAndChanged AS Source ON Target.EmpNumber = Source.EmpNumber
WHEN MATCHED AND (COALESCE (Target.EmpName, '') <> COALESCE (Source.EmpName, '')
                  ) THEN UPDATE 
    SET Target.EmpName           = Source.EmpName,


WHEN NOT MATCHED BY TARGET THEN INSERT ([EmpName], [EmpNumber])

WHEN NOT MATCHED BY SOURCE AND Target.Active = 1 THEN UPDATE 
    SET Active = 0
    output $action as act;