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
MERGE INTO: Especifica a tabela de destino onde as alterações serão aplicadas.USING: Define a tabela (ou conjunto de dados) de origem.ON: Define a condição de correspondência entre a origem e o destino.WHEN MATCHED: Especifica o que fazer quando houver uma correspondência entre origem e destino (normalmente, atualizar).WHEN NOT MATCHED BY TARGET: Indica a ação para registros na origem que não existem no destino (normalmente, inserir).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:
-
Registros Correspondentes (
WHEN MATCHED):- Atualiza os campos
NomeeEmailemClientesDestinopara refletir os valores deClientesOrigem.
- Atualiza os campos
-
Registros Não Encontrados no Destino (
WHEN NOT MATCHED BY TARGET):- Insere registros que existem na origem mas não no destino.
-
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
MERGEpode 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
OUTPUTpara 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.