我想使用merge命令更新目标中不在源集中的所有行。
我只使用了两个带有更新命令的操作,但我总是得到"无法插入重复的键错误" - 当我阅读technet文章时,不应该执行任何插入语句......
declare @stagingid as decimal = 2
MERGE SDH.dbo.SDH_ProduktPreis AS T
USING (SELECT *
FROM Staging.mtc.SDH_Produktpreis
WHERE Staging_ID = @stagingid) AS S
ON S.PRPR_CPC = T.PRPR_CPC
AND S.PRPR_Preistyp = T.PRPR_Preistyp
AND T.PRPR_Origin = 'FromSource'
WHEN MATCHED
AND S.PRPR_CPC = T.PRPR_CPC
AND S.PRPR_Preistyp = T.PRPR_Preistyp
AND S.PRPR_Preis <> T.PRPR_Preis
AND S.PRPR_Gueltig_bis = T.PRPR_Gueltig_bis
AND S.Staging_ID = @stagingid
THEN UPDATE SET T.PRPR_sys_status = 6,
T.PRPR_Gueltig_bis = (SELECT CAST(GETDATE() as datetime)),
T.PRPR_sys_change_timestamp = GETDATE()
WHEN NOT MATCHED BY SOURCE
AND T.PRPR_Origin= 'FromSource'
THEN UPDATE SET T.PRPR_Gueltig_bis = (SELECT CAST(GETDATE() as datetime)),
T.PRPR_sys_status = 6,
T.PRPR_sys_change_timestamp = GETDATE();
如果我添加&#34;当没有匹配来源时#34;命令SSMS始终抱怨插入重复键是不可能的。 (目标中的所有行都设置了PRPR_Origin字段,因此只有那些在命令中有所了解。
来自Technet: 当没有与源匹配时 指定target_table的所有行与ON返回的行不匹配,并且满足任何其他搜索条件,将根据该子句进行更新或删除。
插入命令没有任何内容。 有人对我有建议吗?我的大脑在哪里误导我?
编辑: 源表和目标表的名称相似但不相同。它们甚至不在同一个数据库中..
源表是目标的扩展版本,只有一个密钥:Staging_ID。 目标表具有相同的模式,但不具有Staging_ID列。在目标中,PK是PRPR_CPC,PRPR_Vertriebsweg,RPR_Preistyp和PRPR_Gueltig_bis的组合。
PK的一些示例数据标记为黄色:
但我真正不知道的是,为什么我的声明会创建一个带有&#34;不与源匹配的插入&#34;,这种行为不适合MS Technet文章。
编辑: 对于任何人偶然发现这个线程,体验类似的东西。 这里的问题是,merge命令作为批量操作执行。在我的情况下,这会导致临时主键违规,同时执行查询。