quinta-feira, 1 de outubro de 2009

Utilizando a Instrução MERGE no SQL Server

Uma novidade na parte DML do T-SQL é a instrução MERGE. Esta instrução tem como objeto principal dar mais flexibilidade para a parte ETL do SQL Server.

Basicamente, esta instrução faz um comparativo entre os dados de origem e o destino e permite disparar uma instrução DML em cima da análise que é executada deste comparativo. Por exemplo, Se a origem for correspondente com o destino, a instrução MERGE vai apenas fazer um UPDATE dos dados dentro do destino, esta é a primeira análise que será executada. Por outro lado, os dados da origem que não corresponderem com o destino, é realizado um INSERT dos novos dados na tabela de destino. Todo esse processo é realizado justamente com o objeto de evitar que haja redundância de informações, ou até mesmo um erro de violação de integridade dos dados que possam existir entre a origem e o destino. Caso a fonte de dados que está sendo usada para fazer o comparativo entre a origem e o destino não for correspondente, ou seja, o SQL identifica que dados do destino não existem na origem, será realizado um DELETE dos dados que estão sendo processados no destino.

Abaixo um exemplo da utilização do comando MERGE:

MERGE Stock S
 USING Trades T
 ON S.Stock = T.Stock
 WHEN MATCHED AND (Qty + Delta = 0) THEN
  DELETE
 WHEN MATCHED THEN
  UPDATE SET Qty = Delta
 WHEN NOT MATCHED THEN
  INSERT VALUES (Stock, Delta)

No Exemplo acima temos MERGE Stock, demos um apelido chamado "S" para referencia-lo mais a frente possibilitando esse processo de extração de dados entre fontes diferentes. Esta primeira é a origem.
Logo após temos uma instrução USING seguido da tabela Trades apelidada de "T" e esta será o destino. Depois fazemos um comparativo onde "S.Stock = T.Stock", esta é a ligação entre as chaves das duas tabelas.
Agora começam as comparações para estabelecermos a tomada de decisão. O primeiro comando "WHEN MATCHED AND (Qty + Delta = 0)" determina que se os registros existirem ambos na origem quanto no destino e a soma dos campos Qty e Delta for 0, o registro deve ser excluído, abaixo bem a instrução DELETE. Caso não atenda a esta condição vai para a próxima "WHEN MATCHED", ou seja, o registro foi encontrado, neste caso estamos fazendo um UPDATE. Caso não atenda nenhuma das duas primeiras, vamos para o próximo que é o "WHEN NOT MATCHED", ou seja, existe na origem mas não no destino. Neste caso faremos um INSERT.


Então, quando for utilizada a nova instrução MERGE, é possível fazer INSERT de dados, UPDATE ou DELETE, logicamente tendo como base este comparativo entre a tabela de origem e destino ou fontes de dados.

Até a Próxima

Nenhum comentário:

Postar um comentário