我面临以下问题,我的 MERGE 语句基于不提供主键或任何唯一键的数据(视图),总是只是在每次执行时添加额外的 INSERTS 到目标表。
由于我在比较部分使用了所有列,因此我期望将它们与目标进行比较,如果匹配,则不插入,而只是单独放置。
相反,目标中的行数会随着每次执行而持续增长。
是的,我知道提供主键可能更好。但是我对传递的数据了解不够,在某些情况下根本无法找到主键组合。
在这种情况下如何防止额外的插入?
MERGE INTO [Z].[IAPP] AS Target
USING (
SELECT
[SXD],[UUZQ],[SSRTD],[AAFFT],[IID] From [Z].[vIAPP]
) AS Source ([SXD],[UUZQ],[SSRTD],[AAFFT],[IID])
ON (Target.[SXD] = Source.[SXD] AND Target.[UUZQ] = Source.[UUZQ] AND Target.[SSRTD] = Source.[SSRTD] AND Target.[AAFFT] = Source.[AAFFT] AND Target.[IID] = Source.[IID])
WHEN NOT MATCHED BY TARGET AND @Action = 'UI' THEN
INSERT([SXD],[UUZQ],[SSRTD],[AAFFT],[IID])
VALUES(Source.[SXD],Source.[UUZQ],Source.[SSRTD],Source.[AAFFT],Source.[IID])
WHEN NOT MATCHED BY SOURCE AND @Action = 'D' THEN
DELETE;
我自己发现了这个问题。
比较列中的 NULL 值无法相互匹配。在源和目标周围添加 ISNULL 函数以替换 NULL 以防它存在后,它按预期工作。