Merge no SQL Server
- Amanda Nascimento
- há 3 dias
- 2 min de leitura
A instrução MERGE executa operações de inserção, atualização ou exclusão (INSERT, UPDATE e DELETE) em uma tabela de destino usando os resultados de uma junção com uma tabela de origem, baseado na correspondência entre duas tabelas (uma "fonte" e um destino "alvo").
O MERGE é bem útil em cenários de ETL (Extract, Transform, Load) e em processos de sincronização de dados entre sistemas.
As vantagens de utilizar o merge, são:
Eficiência: Executa múltiplas operações em uma única passagem pelos dados
Atomicidade: Todas as operações são tratadas como uma única transação
Redução de código: Substitui múltiplos comandos INSERT, UPDATE, DELETE
Consistência: Minimiza riscos de inconsistência entre operações separadas.
O MERGE é também conhecido como "upsert" (update + insert) porque pode:
✅ Inserir linhas que não existem na tabela de destino
✅ Atualizar linhas que existem em ambas as tabelas
✅ Opcionalmente deletar linhas da tabela de destino
Sintaxe básica do merge
MERGE INTO tabela1 AS target -- Tabela que será alterada (com alias 'target')
USING tabela2 AS source -- Tabela com dados novos (com alias 'source')
ON target.ProdutoID = source.ProdutoID -- Condição de junção (como as tabelas se relacionam)


Significados matched e Not Matched
Condição | Significado | Ação típica |
WHEN MATCHED | O registro existe nas duas tabelas | UPDATE |
WHEN NOT MATCHED BY TARGET | Só existe na origem | INSERT |
WHEN NOT MATCHED BY SOURCE | Só existe no destino | DELETE |
WHEN MATCHED (Quando há correspondência)

Para todos os registros onde o ProdutoID existe em AMBAS as tabelas, os valores da tabela de destino serão atualizados com os valores da tabela de origem.
WHEN NOT MATCHED (Quando não há correspondência)

Para registros que existem na tabela de origem mas NÃO existem na tabela de destino, um novo registro será inserido na tabela de destino.
Significados target e source
São dois aliases (apelidos) para trazer clareza no script, deixando bem claro de qual tabela cada coluna esta vindo, além de evitar ambiguidade quando as colunas têm o mesmo nome em ambas as tabelas.
target: Representa a tabela de destino (que será modificada)
source: Representa a tabela de origem (que contém os dados novos)
Exemplo: Quando usamos target.NomeProduto, estamos referenciando a coluna NomeProduto da tabela de destino (Estoque), e source.NomeProduto refere-se à coluna da tabela de origem (AtualizacoesEstoque).
Adicionar condições
WHEN MATCHED AND source.Quantidade = 0 THEN -- Só atualiza se quantidade for zero
UPDATE SET target.Quantidade = 0
WHEN NOT MATCHED BY SOURCE THEN -- Para registros que existem no target mas não no source
DELETE -- Remove do target
Controle de transações
BEGIN TRANSACTION;
MERGE INTO Estoque AS target
USING AtualizacoesEstoque AS source
-- ... resto do merge ...
COMMIT TRANSACTION;
-- ou ROLLBACK se algo der errado
Para saber mais, acesse o site da microsoft