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!
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