top of page

Merge no SQL Server

  • Foto do escritor: Amanda Nascimento
    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

© 2017-2025  Criado e desenvolvido por Amanda Nascimento

  • Discord
  • GitHub
  • youtube
  • LinkedIn Amanda
bottom of page