Como utilizar MERGE no SQL Server

Nesse post vamos aprender como utilizar o recurso introduzido a partir do SQL Server 2008, chamado “MERGE”. Com ele, podemos comparar dados entre duas fontes de dados (tabela ou view), e atualizar, inserir ou deletar dados, com base no resultado da comparação.
Vamos criar um cenário, para compreender melhor como utilizar o “MERGE”.
Vamos imaginar que exista um fabricante de carros, ele é responsável por fabricar e distribuir os carros, que não estão em fase de teste. Também existe a loja que vende os carros recebidos do fabricante. Deverá existir uma rotina que preencher os dados dos novos carros que não estão nas lojas ainda.
Vamos começar criando as tabelas.

CREATE TABLE carroFabricante (id INT PRIMARY KEY IDENTITY(1, 1), nome VARCHAR(50), emTeste BIT);

INSERT INTO carroFabricante (nome, emTeste) VALUES ('Voyage', 0);
INSERT INTO carroFabricante (nome, emTeste) VALUES ('Gol', 0);
INSERT INTO carroFabricante (nome, emTeste) VALUES ('Gol G20', 1);
INSERT INTO carroFabricante (nome, emTeste) VALUES ('UP', 0);

CREATE TABLE carroLoja (id INT PRIMARY KEY IDENTITY(1, 1), dataHoraEntrada DATETIME, dataHoraAtualizacao DATETIME, carroFabricanteId INT, ativo BIT, emTeste BIT);

Acima temos um script T-SQL que cria uma tabela “carroFabricante” e insere alguns carros. Seguido de outra criação de tabela, chamada “carroLoja”.

Agora, vamos ver a especifição das cláusulas do “MERGE”.

INTO: Define a tabela ou view que servirá de fonte de destino dos dados.
AS: Define um apelido para fonte de dados.
USING: Define a tabela ou view que será usado como fonte de origem dos dados, baseado na condição do filtro da fonte destino com a fonte de origem.
ON: Define as condições de junção da fonte de destino com a fonte de origem.
WHEN MATCHED THEN: Define a ação a ser realizada, quando há linhas na fonte de origem e destino.
WHEN NOT MATCHED [ BY TARGET ] THEN: Define a ação a ser realizada, quando não há linhas da fonte de origem que correspondem com a fonte de destino. Lembrando que o que fica entre “[]” é opcional, entenderemos melhor na pratica como utilizar essa cláusula.

Vamos ver como utilizar o “MERGE” nesse cenário.

MERGE carroLoja AS Destino
USING carroFabricante AS Origem
ON Destino.carroFabricanteId = Origem.id
WHEN MATCHED -- Quando há registros em ambas fontes de dados, executar o UPDATE
THEN UPDATE SET dataHoraAtualizacao = GETDATE()
WHEN NOT MATCHED THEN -- Quando não há registros no destino, executar o INSERT
INSERT (dataHoraEntrada, dataHoraAtualizacao, carroFabricanteId, ativo, emTeste) VALUES (GETDATE(), NULL, Origem.id, 1, Origem.emTeste)
WHEN NOT MATCHED BY SOURCE AND emTeste = 0 THEN
UPDATE SET ativo = 0;

Acima, especificamos que a tabela “carroLoja” servirá como destino dos dados, e demos um apelido como “Destino”. Utilizamos a tabela “carroFabricante” como origem dos dados, e demos o apelido de “Origem”. Na cláusula “ON” definimos qual é o filtro de junção entre as tabelas.
Na cláusula “WHEN MATCHED”, definimos que um “UPDATE” deve ocorrer, atualizando o campo “dataHoraAtualizacao” com a data e hora atual. Quando o registro de origem for encontrado na tabela de destino.
Já na cláusula seguinte “WHEN NOT MATCHED”, definimos como o INSERT deve ser feito, caso os dados de origem não sejam encontrados no destino.
Na última cláusula, utilizamos um parâmetro opcional, para especificar o que deve ocorrer quando um registro está marcado como “true” na coluna “emTeste”, nesse caso um “UPDATE” ocorre na coluna “ativo” para zero.

Espero ter ajudado!
Até a próxima!

Anúncios
Marcado com: , , ,
Publicado em SQL Server
Um comentário em “Como utilizar MERGE no SQL Server
  1. Estudante disse:

    Olá André, com a função MERGE é possível uma tabela “fixa” ser alimentada por uma tabela temporária, certo? no entanto não entendi muito bem esse conceito..
    Poderia me explicar?
    Obrigado

Deixe seu comentário...

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: