Esse artigo faz parte da revista SQL Magazine edição 55. Clique aqui para ler todos os artigos desta edição

eft" align=left>Quando pensamos em juntar informações de dois lugares distintos, a primeira coisa que nos vem à cabeça é como fazer isso. É obvio, este é o primeiro pensamento... depois de alguns segundos começam a surgir as soluções. Para resolver este problema, o conceito de merge é utilizado há um tempo considerável em outras tecnologias. No Excel, por exemplo, podemos juntar duas células fazendo merge, o mesmo se aplica a uma tabela em HTML. Podemos fazer merge até na disciplina de Estrutura de Dados, integrando os dados de duas matrizes em uma única. No SQL Server, este conceito veio somente com a versão 2008. Até a última versão, a 2005, se precisássemos juntar estas informações, precisávamos fazer o trabalho manual, utilizando instruções de INSERTs e UPDATEs. Com o SQL Server 2008 esta tarefa se tornou trivial!

Com a funcionalidade de Merge do SQL Server 2008, é possível realizar esta tarefa de uma forma prática e rápida, economizando processamento e tempo de execução. Neste artigo, iremos apresentar esta nova funcionalidade provida a partir desta versão do SQL Server. Para isso, criamos quatro exemplos para demonstrar a utilização do Merge em bancos de dados. O primeiro atualiza as informações da tabela de Produto baseado nas informações da tabela de Venda, no segundo exemplo criamos uma tabela de Fornecedor vazia e inserimos os dados de outras duas tabelas de fornecedores nesta nova tabela. No terceiro exemplo, consultamos as tabelas de autores de artigos para as revistas SQL Magazine e WebMobile, ambas do grupo DevMedia, e montamos uma terceira tabela, somente com os nomes de autores que escrevem apenas para uma das revistas. Para o quarto e último exemplo, juntamos os recursos dos três exemplos anteriores de merge, só que este é surpresa!

 

Merge no SQL Server

Nas últimas versões do SQL Server, quando precisávamos juntar algumas informações de fontes de dados diferentes, precisávamos fazer INSERTs e UPDATEs manualmente. Com o SQL Server 2008 [que ainda está em versão CTP - Community Technology Preview] isso não é mais trabalhoso. Poderemos trabalhar utilizando uma nova funcionalidade chamada Merge.

Com o Merge conseguimos melhorar significativamente o desempenho para operações de INSERT, UPDATE e DELETE. O Merge nos permite juntar informações de uma origem a um destino. Esta origem pode ser uma View, uma Function ou uma Tabela. E o destino pode ser uma Tabela ou uma View.

 

Como é a sintaxe para se trabalhar com Merge

O código do Merge é separado em quatro cláusulas principais. Cada uma delas tem seu objetivo bem definido no código T-SQL (Transact SQL).

Estas quatro cláusulas formam a sintaxe mais básica e simples de utilização do Merge. Existem outras adaptações que podem ser colocadas para incrementar o código e chegar a um objetivo mais complexo. Nos exemplos, utilizaremos somente as quatro cláusulas principais, que já apresentarão o resultado esperado.

A estrutura básica do Merge pode ser escrita simplesmente como está exibida na Listagem 1.

 

Listagem 1. Forma básica do Merge

MERGE tabelaDestino d

USING tabelaOrigem o

ON o.coluna = d.coluna

WHEN MATCHED THEN

         DELETE;

 

Vamos agora entender o que temos em cada uma das cláusulas do código:

·         MERGE à É a definição do destino que receberá os dados processados. Este destino pode ser entendido como uma Tabela ou uma View. Todas as alterações ocorrerão neste destino independentemente de qual seja a alteração ou a origem dos dados.

·         USING à Especifica a origem dos dados que será utilizado pelo código, e baseado nas condições da clausula ON, verifica a ligação com os dados do destino. Esta origem pode ser determinada por uma Tabela, uma View ou até uma Function. Ela será utilizada como base para alterar o destino e não sofrerá nenhuma alteração em seus dados.

·         ON à Especifica a condição de ligação das tabelas e segue o mesmo conceito do ON utilizado em um JOIN. Nesta cláusula devem ser ligadas as colunas relacionadas entre as fontes de dados de origem e de destino. Geralmente são utilizadas as colunas que existem nas duas tabelas (leia fonte de dados).

·         WHEN à Pode-se dizer que esta clausula é o núcleo principal do merge. Ela determina qual ação será realizada no destino. Sempre deve estar acompanhada por uma de suas duas possibilidades (MATCHED ou NOT MATCHED). O final da instrução sempre vem acompanhado do termo THEN, ficando WHEN MATCHED THEN ou então WHEN NOT MATCHED THEN. Continuando nesta cláusula, é possível inserir filtros como fazemos em um WHERE, com o objetivo de restringir as possibilidades e deixar o funcionamento mais exato e granular possível. Pode-se utilizar ANDs ou ORs em quantas ocorrências de WHEN forem necessárias.

 

A opção de NOT MATCHED é utilizada para inserir as informações no destino, quando a clausula ON não for satisfatória. Isso significa que a ligação das duas tabelas não retornou nenhuma informação, logo esta informação não existe em uma das fontes de dados. Em 100% dos casos é criada uma instrução de INSERT. Não existe a possibilidade de executar uma instrução de UPDATE ou DELETE vinculada à opção de NOT MATCHED. Se tentar executar esta operação, uma mensagem de erro é disparada pelo SQL Server, informando sobre esta restrição (Listagem 2). Se for utilizada WHEN DESTINO NOT MATCHED THEN esta cláusula funcionará como um LEFT JOIN entre a origem e o destino, retornando todas as linhas da origem. Se for utilizada como WHEN ORIGEM NOT MATCHED THEN então o LEFT JOIN será contemplado entre o destino e a origem, retornando todas as linhas do destino.

 

Listagem 2. Mensagens de erro ao tentar usar UPDATE e DELETE com NOT MATCHED

An action of type 'UPDATE' is not allowed in the 'WHEN NOT MATCHED' clause of a MERGE statement.

 

An action of type 'DELETE' is not allowed in the 'WHEN NOT MATCHED' clause of a MERGE statement.

 

Observe a Figura 1. Nela, a tabela Origem possui alguns dados e a tabela Destino está vazia. Quando o método Merge é executado, a tabela Destino passará a ter todos os dados que existiam na tabela Origem. Continuando com a explicação da opção NOT MATCHED, veja agora a ...

Quer ler esse conteúdo completo? Tenha acesso completo