(T)SQL Merge Command

时间:2017-05-24 10:45:00

标签: sql sql-server tsql merge ssms

我想使用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命令作为批量操作执行。在我的情况下,这会导致临时主键违规,同时执行查询。

0 个答案:

没有答案