Skip to main content

Merge | SQL SERVER

  • Merge | SQL SERVER

No SQL Server, o comando MERGE é usado para combinar operações de inserção, atualização e deleção em uma única instrução, simplificando cenários em que você precisa sincronizar dados entre tabelas. Ele é particularmente útil para upserts (inserir ou atualizar dependendo da existência do registro).

A sintaxe básica do MERGE é:

MERGE INTO TargetTable AS Target
USING SourceTable AS Source
ON Target.KeyColumn = Source.KeyColumn
WHEN MATCHED THEN
-- Atualiza os registros que já existem
UPDATE SET Target.Column1 = Source.Column1, Target.Column2 = Source.Column2
WHEN NOT MATCHED BY TARGET THEN
-- Insere novos registros
INSERT (Column1, Column2) VALUES (Source.Column1, Source.Column2)
WHEN NOT MATCHED BY SOURCE THEN
-- (Opcional) Exclui registros que não estão na origem
DELETE;

Componentes do MERGE

  1. MERGE INTO: Especifica a tabela de destino onde as alterações serão aplicadas.
  2. USING: Define a tabela (ou conjunto de dados) de origem.
  3. ON: Define a condição de correspondência entre a origem e o destino.
  4. WHEN MATCHED: Especifica o que fazer quando houver uma correspondência entre origem e destino (normalmente, atualizar).
  5. WHEN NOT MATCHED BY TARGET: Indica a ação para registros na origem que não existem no destino (normalmente, inserir).
  6. WHEN NOT MATCHED BY SOURCE: Define a ação para registros no destino que não estão na origem (normalmente, excluir).

Exemplo Prático

Cenário:

Você tem duas tabelas: ClientesDestino (tabela de destino) e ClientesOrigem (dados novos a serem mesclados). Ambas têm uma coluna chamada ClienteID.

Código:

MERGE INTO ClientesDestino AS Target
USING ClientesOrigem AS Source
ON Target.ClienteID = Source.ClienteID
WHEN MATCHED THEN
UPDATE SET
Target.Nome = Source.Nome,
Target.Email = Source.Email
WHEN NOT MATCHED BY TARGET THEN
INSERT (ClienteID, Nome, Email)
VALUES (Source.ClienteID, Source.Nome, Source.Email)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;

Explicação:

  1. Registros Correspondentes (WHEN MATCHED):

    • Atualiza os campos Nome e Email em ClientesDestino para refletir os valores de ClientesOrigem.
  2. Registros Não Encontrados no Destino (WHEN NOT MATCHED BY TARGET):

    • Insere registros que existem na origem mas não no destino.
  3. Registros Não Encontrados na Origem (WHEN NOT MATCHED BY SOURCE):

    • Exclui registros no destino que não estão na origem.

Considerações:

  • Desempenho: O comando MERGE pode ser menos eficiente que comandos separados para grandes conjuntos de dados. Teste para avaliar impactos de desempenho.
  • Erros Potenciais: Tome cuidado com condições de correspondência (ON) mal definidas, que podem causar atualizações inesperadas.
  • Acompanhamento: Use a cláusula OUTPUT para monitorar o que foi inserido, atualizado ou excluído.

Exemplo com OUTPUT:

MERGE INTO ClientesDestino AS Target
USING ClientesOrigem AS Source
ON Target.ClienteID = Source.ClienteID
WHEN MATCHED THEN
UPDATE SET Target.Nome = Source.Nome
WHEN NOT MATCHED BY TARGET THEN
INSERT (ClienteID, Nome) VALUES (Source.ClienteID, Source.Nome)
OUTPUT $action, Inserted.*, Deleted.*;

Isso permite rastrear as mudanças feitas pelo comando MERGE.