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 ...
Artigo SQL Magazine 55 - Aplicando Merge com SQL Server 2008
Artigo publicado Revista SQL Magazine 55.
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.