Prezados
O comando MERGE, antes exclusivo do Oracle, agora também está presente no SQL Server (2008 em diante). Ele é muito interessante para situações onde se deseja fazer um UPDATE ou INSERT, baseado na existência ou não dos dados na tabela destino. Sua performance é MUITO melhor que efetuar o select para verificar a existência, e então decidir entre o update ou o insert, pois o merge faz tudo ao mesmo tempo, para todos os registros.
A sintaxe básica do comando é:
MERGE INTO
USING
ON ( )
WHEN MATCHED THEN
UPDATE SET
WHEN NOT MATCHED THEN
INSERT ( )
VALUES ( )
Como exemplo, suponha que se deseje atualizar uma tabela de pessoas jurídicas, baseado em uma tabela genérica com todos os clientes. O comando seria algo assim:
MERGE INTO tb_pj dst
USING (select cod_cli,
nome_cli,
cpfcnpj
from tb_cli
where cli_tip = 'PJ') ori (ori é um alias qualquer, para o select dos clientes PJ)
ON (dst.cod_cli = ori.cod_cli) (join da ori com dst, para definir a existência dos dados)
WHEN MATCHED THEN UPDATE (lista das colunas que serão atualizadas, caso já exista)
SET dst.hdrdathor = getdate(),
nome = ori.nome,
dst.cnpj = ori.cpfcnpj
WHEN NOT MATCHED THEN INSERT ( (colunas da dst que receberão valores)
hdrdathor,
cod_cli,
nome_cli,
cnpj )
VALUES ( (lista de valores que serão inseridos)
getdate(),
ori.nome_cli,
ori.cpfcnpj )
Equipe DTP