MERGE
foi introduzido no SQL Server 2008. Se você quiser usar essa sintaxe, precisará atualizar. Caso contrário, a abordagem típica dependerá de onde os dados de origem são. Se for apenas uma linha e você não souber se precisa atualizar ou inserir, provavelmente faria:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Se sua fonte for uma tabela #temp, variável de tabela, TVP ou outra tabela, você pode fazer:
UPDATE dest SET ...
FROM dbo.destination AS dest
INNER JOIN dbo.source AS src
ON dest.key = src.key;
INSERT dbo.destination SELECT ... FROM dbo.source AS src
WHERE NOT EXISTS (SELECT 1 FROM dbo.destination WHERE key = src.key);
Assim como com
MERGE
(e como Michael Swart demonstrou aqui
), você ainda desejará cercar qualquer um desses métodos com transações adequadas, tratamento de erros e nível de isolamento para se comportar como uma operação única e verdadeira. Mesmo um único MERGE
declaração não protege você da simultaneidade. Publiquei alguns outros avisos sobre MERGE em mais detalhes aqui .