Estou enfrentando o seguinte problema, minhas instruções MERGE baseadas em dados (exibições) que não fornecem chaves primárias ou nenhuma chave exclusiva, sempre apenas ADICIONE INSERTS adicionais em cada execução na tabela de destino.
Como usei TODAS AS COLUNAS na parte de comparação, esperava que fossem comparadas com o destino e, no caso de correspondência, NÃO inseridas, mas deixadas sozinhas.
Em vez disso, o número de linhas no destino continua crescendo continuamente a cada execução.
Sim, eu sei que pode ser melhor entregar a chave primária. Mas não tenho conhecimento suficiente sobre os dados entregues e, em alguns casos, não foi possível encontrar uma combinação de chave primária.
Como posso evitar inserções adicionais nesse caso?
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;
Eu mesmo encontrei o problema.
Foram valores NULL nas colunas comparadas que não puderam ser correspondidas entre si. Depois de adicionar a função ISNULL em torno da origem e do destino para substituir NULL, caso esteja lá, funciona conforme o esperado.