Banco de Dados - SQL Server
Merge com SQL Server 2008
Uma das grandes novidades do SQL Server 2008 é a facilidade para mesclar dados utilizando o conceito de MERGE.
por Diego NogareUma das grandes novidades do SQL Server 2008 é a facilidade para mesclar dados utilizando o conceito de MERGE. Esta operação permite recuperar dados de uma origem e realizar diversas ações baseadas nos resultados de JOIN (junção) entre a origem e o destino. O MERGE aumenta consideravelmente o desempenho na utilização de INSERT, UPDATE e DELETE em casos específicos.
A criação de uma condição MERGE é relativamente simples, no melhor caso são apenas quatro passos para sua composição.
Imagine o seguinte cenário: Em uma rede de lojas, foram criadas tabelas com nomes diferentes, mas com a mesma estrutura. Cada tabela armazena os produtos que tem em sua loja (a tabela tblLoja1 armazena os produtos da Loja 1, e a tabela tblLoja2 armazena os produtos da Loja 2). Em um determinado momento, o dono da rede de lojas solicita que seja feita uma centralização dos dados, para a criação de uma aplicação Web.
Com base neste cenário, criamos e populamos as duas tabelas de produtos das lojas.
Depois de criar e inserir alguns registros em cada uma das duas tabelas separadas das Lojas, vamos criar a tabela tblLojas. Repare que a estrutura das 3 tabelas são iguais, isso não é uma regra, é só para simplificar o exemplo. Poderiam ser diferentes, sem problema algum.
Finalmente chegamos ao ponto onde utilizaremos o MERGE para colocar todas as informações na tabela tblLojas, baseada nas tabelas tblLoja1 e tblLoja2.
No primeiro exemplo de MERGE, utilizaremos a tabela tblLojas como sendo o destino dos dados e a tabela tblLojas1 como sendo a origem. Faremos a ligação das duas tabelas nos baseando na coluna proCodigo [terceira linha]. Quando a clausula ON for satisfatório (verdadeira), o processamento executará o bloco definido em MATCHED, para resultados cuja clausula ON seja negativa, o SQL Server 2008 executará o bloco NOT MATCHED.
Neste momento, como a tabela tblLojas ainda está vazia, somente o bloco NOT MATCHED (que insere os valores) será executado.
Consultando a tabela tblLojas, os dados estão idênticos à tabela tblLoja1.
Agora, para executar o MERGE da tabela tblLoja2 com a tabela tblLojas, criamos o segundo exemplo de código que é muito parecido com o primeiro, a não ser pela tabela utilizada como origem dos dados e pelos processamentos que serão executados com base no resultado da clausula ON.
Agora, depois de executar esse código que, quando encontra proCodigo que existe na tabela tblLojas e também existem na tabela tblLoja2, atualiza a proDescricao para "AmbasLojas", consultar a tabela tblLojas, conseguimos ver com clareza que alguns dados foram inseridos e outros dados atualizados.
Na hora que populamos as tabelas das lojas, os produtos de código 15 a 20 se repetiram propositalmente, para forçar esta igualdade de dados, e como está no exemplo, atualizar a tabela destino.
Concluímos que utilizar o MERGE é mais rápido e simples do que escrever código para fazer uma junção de dados de duas tabelas. Esta nova funcionalidade deve ser utilizada sempre que possível. Ela é muito mais performática do que criar um procedimento fazendo as verificações manualmente.
Até a próxima.
A criação de uma condição MERGE é relativamente simples, no melhor caso são apenas quatro passos para sua composição.
- MERGE: Especifica os dados de destino da operação definida na clausula WHEN;
- USING: Especificam os dados de origem que serão comparados com os dados de destino, definido na clausula MERGE;
- ON: Encontra os dados em evidência, interligando as condições de origem e destino;
- WHEN: Aumenta a granularidade do filtro, incrementando a clausula ON.
Imagine o seguinte cenário: Em uma rede de lojas, foram criadas tabelas com nomes diferentes, mas com a mesma estrutura. Cada tabela armazena os produtos que tem em sua loja (a tabela tblLoja1 armazena os produtos da Loja 1, e a tabela tblLoja2 armazena os produtos da Loja 2). Em um determinado momento, o dono da rede de lojas solicita que seja feita uma centralização dos dados, para a criação de uma aplicação Web.
Com base neste cenário, criamos e populamos as duas tabelas de produtos das lojas.
Depois de criar e inserir alguns registros em cada uma das duas tabelas separadas das Lojas, vamos criar a tabela tblLojas. Repare que a estrutura das 3 tabelas são iguais, isso não é uma regra, é só para simplificar o exemplo. Poderiam ser diferentes, sem problema algum.
Finalmente chegamos ao ponto onde utilizaremos o MERGE para colocar todas as informações na tabela tblLojas, baseada nas tabelas tblLoja1 e tblLoja2.
No primeiro exemplo de MERGE, utilizaremos a tabela tblLojas como sendo o destino dos dados e a tabela tblLojas1 como sendo a origem. Faremos a ligação das duas tabelas nos baseando na coluna proCodigo [terceira linha]. Quando a clausula ON for satisfatório (verdadeira), o processamento executará o bloco definido em MATCHED, para resultados cuja clausula ON seja negativa, o SQL Server 2008 executará o bloco NOT MATCHED.
Neste momento, como a tabela tblLojas ainda está vazia, somente o bloco NOT MATCHED (que insere os valores) será executado.
Consultando a tabela tblLojas, os dados estão idênticos à tabela tblLoja1.
Agora, para executar o MERGE da tabela tblLoja2 com a tabela tblLojas, criamos o segundo exemplo de código que é muito parecido com o primeiro, a não ser pela tabela utilizada como origem dos dados e pelos processamentos que serão executados com base no resultado da clausula ON.
Agora, depois de executar esse código que, quando encontra proCodigo que existe na tabela tblLojas e também existem na tabela tblLoja2, atualiza a proDescricao para "AmbasLojas", consultar a tabela tblLojas, conseguimos ver com clareza que alguns dados foram inseridos e outros dados atualizados.
Na hora que populamos as tabelas das lojas, os produtos de código 15 a 20 se repetiram propositalmente, para forçar esta igualdade de dados, e como está no exemplo, atualizar a tabela destino.
Concluímos que utilizar o MERGE é mais rápido e simples do que escrever código para fazer uma junção de dados de duas tabelas. Esta nova funcionalidade deve ser utilizada sempre que possível. Ela é muito mais performática do que criar um procedimento fazendo as verificações manualmente.
Até a próxima.
- Representando dados em XML no SQL ServerSQL Server
- Diferenças entre SEQUENCES x IDENTITY no Microsoft SQL Server 2012SQL
- Utilizando FILETABLE no SQL Server 2012SQL Server
- NHibernate com o Delphi Prism: Acessando um Banco de Dados SQL ServerVisual Studio
- Novidades no SQL Server Codinome DenaliSQL Server