MERGE (Transact-SQL) (Português)

  • 20/08/2019
  • 25 minutos para ler
    • X
    • c
    • j
    • r
    • a
    • +18

Aplica-se a: SQL Server (todas as versões com suporte) Banco de dados SQL do Azure Azure Synapse Analytics

Executa operações de inserção, atualização ou exclusão em uma tabela de destino de os resultados de uma junção com uma tabela de origem. Por exemplo, sincronize duas tabelas inserindo, atualizando ou excluindo linhas em uma tabela com base nas diferenças encontradas na outra tabela.

Nota

MERGE está atualmente em visualização para Azure Synapse Analytics.

Dica de desempenho: o comportamento condicional descrito para a instrução MERGE funciona melhor quando as duas tabelas têm uma mistura complexa de características correspondentes. Por exemplo, inserir uma linha se ela não existir ou atualizar uma linha se ela corresponder. Ao simplesmente atualizar uma tabela com base nas linhas de outra tabela, melhore o desempenho e a escalabilidade com instruções básicas INSERT, UPDATE e DELETE. exemplo:

Convenções de sintaxe Transact-SQL

Sintaxe

Observação

Para visualizar a sintaxe Transact-SQL do SQL Server 2014 e anterior, consulte a documentação das versões anteriores.

Argumentos

COM < common_table_expression >
Especifica o conjunto de resultados nomeado temporário ou visualização, também conhecido como expressão de tabela comum, que é definido dentro do escopo da declaração MERGE. O conjunto de resultados deriva de uma consulta simples e é referenciado pela instrução MERGE. Para obter mais informações, consulte WITH common_table_expression (Transact-SQL).

TOP (expressão)
Especifica o número ou porcentagem de linhas afetadas. expression pode ser um número ou uma porcentagem das linhas. As linhas referenciadas na expressão TOP não são organizadas em nenhuma ordem. Para obter mais informações, consulte TOP (Transact-SQL).

A cláusula TOP se aplica depois que toda a tabela de origem e toda a tabela de destino se unem e as linhas unidas que não se qualificam para uma inserção, atualização ou ação de exclusão são removidas. A cláusula TOP reduz ainda mais o número de linhas unidas para o valor especificado. As ações de inserção, atualização ou exclusão aplicam-se às linhas unidas restantes de forma não ordenada. Ou seja, não há ordem em que o as linhas são distribuídas entre as ações definidas nas cláusulas WHEN. Por exemplo, especificar TOP (10) afeta 10 linhas. Destas linhas, 7 podem ser atualizadas e 3 inseridas, ou 1 pode ser excluída, 5 atualizada e 4 inserida e assim por diante.

Porque a instrução MERGE faz uma varredura completa da tabela de origem e tabelas de destino, o desempenho de E / S às vezes é afetado ao usar a cláusula TOP para modificar uma grande tabela criando vários lotes. Neste cenário, é importante garantir que todos os lotes sucessivos tenham como destino novas linhas.

database_name
O nome do banco de dados em que target_table está localizado.

schema_name
O nome do esquema ao qual a target_table pertence.

target_table
A tabela ou exibição na qual as linhas de dados de < table_source > são correspondidos com base em < clause_search_condition >. target_table é o destino de qualquer operação de inserção, atualização ou exclusão especificado pelas cláusulas WHEN da instrução MERGE.

Se target_table for uma visão, quaisquer ações contra ela devem satisfazer as condições para atualização de visões. Para obter mais informações, consulte Modificar dados por meio de uma visão.

target_table não pode “ser uma tabela remota. target_table não pode ter nenhuma regra definida.

table_alias
Um nome alternativo para fazer referência a uma tabela para target_table.

USANDO < table_source >
Especifica a fonte de dados que corresponde às linhas de dados em target_table com base na < condição merge_search >. O resultado dessa correspondência dita as ações a serem executadas pelas cláusulas WHEN da instrução MERGE. < table_source > pode ser uma tabela remota ou uma tabela derivada que acessa tabelas remotas.

< table_source > pode ser uma tabela derivada que usa o construtor de valor de tabela Transact-SQL para construir uma tabela especificando várias linhas.

table_alias
Um nome alternativo para fazer referência a uma tabela para table_source.

Para obter mais informações sobre a sintaxe e os argumentos desta cláusula, consulte FROM (Transact-SQL).

ON < merge_search_condition >
Especifica as condições em que < table_source > junta-se a target_table para determinar onde eles correspondem.

Cuidado

É importante especificar apenas as colunas da tabela de destino a serem usadas para fins de correspondência. Ou seja, especifique as colunas da tabela de destino que são comparadas com a coluna correspondente da tabela de origem. Não tente melhorar o desempenho da consulta filtrando as linhas na tabela de destino em a cláusula ON; por exemplo, como especificar AND NOT target_table.column_x = value. Isso pode retornar resultados inesperados e incorretos.

QUANDO CORRESPONDIDO ENTÃO < merge_matched >
Especifica que todas as linhas de * target_table, que correspondem às linhas retornadas por < table_source > ON < merge_search_condition >, e satisfazem qualquer condição de pesquisa adicional, são atualizados ou excluídos de acordo com < merge_matched >.

A instrução MERGE pode ter, no máximo, duas cláusulas WHEN MATCHED. Se duas cláusulas forem especificadas, a primeira cláusula deve ser acompanhada por uma cláusula AND < search_condition >. Para qualquer linha, a segunda cláusula WHEN MATCHED só é aplicada se a primeira não for. Se houver duas cláusulas WHEN MATCHED, será necessário especificar uma ação UPDATE e uma ação DELETE. Quando UPDATE for especificado no < merge_matched > cláusula e mais de uma linha de < table_source > corresponde a uma linha em target_table com base em < merge_search_condition >, SQL Server retorna um erro. A instrução MERGE pode” atualize a mesma linha mais de uma vez ou atualize e exclua a mesma linha.

QUANDO NÃO CORRESPONDIDO ENTÃO < merge_not_matched >
Especifica que uma linha é inserida em target_table para cada linha retornada por < table_source > ON < merge_search_condition > que não corresponde a uma linha no targ et_table, mas satisfaz uma condição de pesquisa adicional, se presente. Os valores a serem inseridos são especificados pela cláusula < merge_not_matched >. A instrução MERGE pode ter apenas uma cláusula WHEN NOT MATCHED.

WHEN NOT MATCHED BY SOURCE THEN < merge_matched >
Especifica que todas as linhas de * target_table, que não correspondem às linhas retornadas por < table_source > ON < merge_search_condition >, e que satisfaçam qualquer condição de pesquisa adicional, são atualizados ou excluídos de acordo com < merge_matched > cláusula.

A instrução MERGE pode ter no máximo duas cláusulas WHEN NOT MATCHED BY SOURCE. Se duas cláusulas forem especificadas, a primeira cláusula deve ser acompanhada por uma cláusula AND < clause_search_condition >. Para qualquer linha dada, a segunda cláusula WHEN NOT MATCHED BY SOURCE só é aplicada se a primeira isn ” t. Se houver duas cláusulas WHEN NOT MATCHED BY SOURCE, deve-se especificar uma ação UPDATE e outra deve-se especificar uma ação DELETE. Apenas colunas da tabela de destino podem ser referenciadas em < clause_search_condition >.

Quando nenhuma linha é retornada por < table_source >, as colunas na tabela de origem não podem “ser acessadas. Se a ação de atualização ou exclusão especificada no < merge_matched > cláusula faz referência a colunas na tabela de origem, erro 207 (nome de coluna inválido) é retornado. Por exemplo, a cláusula WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 pode fazer com que a instrução falhe porque Col1 na tabela de origem está inacessível.

E < clause_search_condition >
Especifica qualquer condição de pesquisa válida. Para obter mais informações, consulte Condições de pesquisa (Transact-SQL).

< table_hint_limited >
Especifica uma ou mais dicas de tabela a serem aplicadas na tabela de destino para cada um dos e inserir, atualizar ou excluir ações feitas pela instrução MERGE. A palavra-chave WITH e os parênteses são obrigatórios.

NOLOCK e READUNCOMMITTED não são permitidos. Para obter mais informações sobre dicas de tabela, consulte Dicas de tabela (Transact-SQL).

Especificar a dica TABLOCK em uma tabela que é o destino de uma instrução INSERT tem o mesmo efeito que especificar a dica TABLOCKX. Um bloqueio exclusivo é obtido na tabela. Quando FORCESEEK é especificado, ele se aplica a a instância implícita da tabela de destino unida à tabela de origem.

Cuidado

A especificação de READPAST com WHEN NOT MATCHED THEN INSERT pode resultar em operações INSERT que violam as restrições UNIQUE.

INDEX (index_val)
Especifica o nome ou ID de um ou mais índices na tabela de destino para fazer uma junção implícita com a tabela de origem. Para obter mais informações, consulte Dicas de tabela (transação -SQL).

< output_clause >
Retorna uma linha para cada linha em target_table que “s atualizado, inserido ou excluído, em nenhuma ordem específica. $ action pode ser especificada na cláusula de saída. $ action é uma coluna do tipo nvarchar (10) que retorna um dos três valores para cada linha: “INSERT”, “UPDATE” ou “DELETE”, de acordo com a ação realizada nessa linha. Para obter mais informações sobre os argumentos e o comportamento dessa cláusula, consulte OUTPUT Clause (Transact-SQL).

< merge_matched >
Especifica a ação de atualização ou exclusão aplicada a todas as linhas de target_table que não correspondem às linhas retornadas por < table_source > ON < merge_search_condition >, e que satisfazem qualquer condição de pesquisa adicional.

ATUALIZAR SET < set_clause >
Especifica a lista de colunas ou nomes de variáveis para atualizar na tabela de destino e os valores com os quais atualizá-los.

Para obter mais informações sobre os argumentos desta cláusula, consulte UPDATE (Transact-SQL). Não há suporte para definir uma variável com o mesmo valor de uma coluna.

DELETE
Especifica que as linhas que correspondem às linhas em target_table são excluídas.

< merge_not_matched >
Especifica os valores a serem inseridos na tabela de destino.

(column_list)
Uma lista de um ou mais colunas da tabela de destino na qual inserir dados. As colunas devem ser especificadas como um nome de parte única ou a instrução MERGE falhará. column_list deve ser colocada entre parênteses e delimitada por vírgulas.

VALUES ( valores_lista)
Uma lista separada por vírgulas de constantes, variáveis ou expressões que retornam valores para inserir na tabela de destino. As expressões não podem “conter uma instrução EXECUTE.

VALORES PADRÃO
Força o linha inserida para conter os valores padrão definidos para cada coluna.

Para obter mais informações sobre esta cláusula, consulte INSERT (Transact-SQL).

< condição_pesquisa >
Especi encontra as condições de pesquisa para especificar < merge_search_condition > ou < clause_search_condition >. Para obter mais informações sobre os argumentos para esta cláusula, consulte Condições de pesquisa (Transact-SQL).

< padrão de pesquisa de gráfico >
Especifica o padrão de correspondência do gráfico. Para obter mais informações sobre os argumentos para esta cláusula, consulte MATCH (Transact-SQL)

Comentários

Observação

No Azure Synapse Analytics, o MERGE O comando (visualização) tem as seguintes diferenças em comparação com o servidor SQL e o banco de dados SQL do Azure.

  • Uma atualização MERGE é implementada como um par de exclusão e inserção. A contagem de linhas afetadas para uma atualização MERGE inclui as linhas excluídas e inseridas.
  • Durante a visualização, as tabelas com coluna de identidade não são suportadas pelo comando Synapse SQL MERGE.
  • O suporte para tabelas com diferentes tipos de distribuição são descritas nesta tabela:
MERGE CLAUSE no Azure Synapse Analytics Tabela de distribuição TARGE compatível Tabela de distribuição SOURCE compatível Comentário
QUANDO CORRESPONDENTE Todos os tipos de distribuição Todos os tipos de distribuição
NÃO CORRESPONDENTE AO ALVO HASH Todos os tipos de distribuição Use UPDATE / DELETE FROM… JOIN para sincronizar duas tabelas.
NÃO CORRESPONDENTE À FONTE Todos os tipos de distribuição Todos os tipos de distribuição

Pelo menos uma das três cláusulas MATCHED deve ser especificada, mas elas podem ser especificadas em qualquer ordem. Uma variável não pode ser atualizada mais de uma vez na mesma cláusula MATCHED.

Qualquer ação de inserção, atualização ou exclusão especificada na tabela de destino pela instrução MERGE é limitada por quaisquer restrições definidas nela, incluindo quaisquer restrições de integridade referencial em cascata. Se IGNORE_DUP_KEY estiver ON para qualquer índice exclusivo na tabela de destino, MERGE ignora essa configuração.

A instrução MERGE requer um ponto e vírgula (;) como terminador de instrução. O erro 10713 é gerado quando uma instrução MERGE é executada sem o terminador.

Quando usado após MERGE, @@ ROWCOUNT (Transact-SQL) retorna o número total de linhas inseridas, atualizadas e excluídas para o cliente.

MERGE é uma palavra-chave totalmente reservada quando o nível de compatibilidade do banco de dados é definido como 100 ou superior. A instrução MERGE está disponível em níveis de compatibilidade de banco de dados 90 e 100; entretanto, a palavra-chave não é totalmente reservada quando o nível de compatibilidade do banco de dados é definido como 90.

Não use a instrução MERGE ao usar a replicação de atualização enfileirada. O MERGE e o gatilho de atualização na fila não são compatíveis. Substitua a instrução MERGE por uma instrução de inserção ou atualização.

Implementação do gatilho

Para cada ação de inserção, atualização ou exclusão especificada em a instrução MERGE, o SQL Server dispara quaisquer gatilhos AFTER correspondentes definidos na tabela de destino, mas não garante qual ação disparará primeiro ou por último. Os gatilhos definidos para a mesma ação respeitam a ordem que você especificar. Para obter mais informações sobre como definir a ordem de disparo do gatilho, consulte Especificar o primeiro e o último gatilhos.

Se a tabela de destino tiver um gatilho INSTEAD OF ativado definido para uma ação de inserção, atualização ou exclusão realizada por uma instrução MERGE , deve ter um gatilho INSTEAD OF habilitado para todas as ações especificadas na instrução MERGE.

Se qualquer gatilho INSTEAD OF UPDATE ou INSTEAD OF DELETE estiver definido em target_table, as operações de atualização ou exclusão não serão Em vez disso, os gatilhos são disparados e as tabelas inseridas e excluídas são preenchidas de acordo.

Se algum gatilho INSTEAD OF INSERT for definido em target_table, a operação de inserção não será executada. Em vez disso, a tabela é preenchida de acordo.

Permissões

Requer permissão SELECT na tabela de origem e permissões INSERT, UPDATE ou DELETE na tabela de destino. Para obter mais informações, consulte a seção Permissões nos artigos SELECT, INSERT, UPDATE e DELETE.

Otimizando o desempenho da instrução MERGE

Usando a instrução MERGE, você pode substituir o DML individual declarações com uma única declaração. Isso pode melhorar o desempenho da consulta porque as operações são executadas em uma única instrução, minimizando o número de vezes que os dados nas tabelas de origem e destino são processados. No entanto, os ganhos de desempenho dependem da existência de índices, junções e outras considerações corretas.

Práticas recomendadas de índice

Para melhorar o desempenho da instrução MERGE, recomendamos as seguintes diretrizes de índice :

  • Crie um índice nas colunas de junção na tabela de origem que seja único e abrangente.
  • Crie um índice clusterizado exclusivo nas colunas de junção na tabela de destino.

Esses índices garantem que as chaves de junção sejam exclusivas e os dados nas tabelas sejam classificados. O desempenho da consulta é melhorado porque o otimizador de consulta não precisa realizar processamento de validação extra para localizar e atualizar linhas duplicadas e operações de classificação adicionais não são necessárias.

JOIN Best Practices

Para melhorar o desempenho da instrução MERGE e garantir que resultados corretos sejam obtidos, recomendamos as seguintes diretrizes de junção:

  • Especifique apenas as condições de pesquisa em ON < merge_search_condition > cláusula que determina os critérios para correspondência de dados nas tabelas de origem e destino. Ou seja, especifique apenas as colunas da tabela de destino que são comparadas às colunas correspondentes da tabela de origem.
  • Não inclua comparações com outros valores, como uma constante.

Para filtrar linhas das tabelas de origem ou destino, use um dos seguintes métodos.

  • Especifique a condição de pesquisa para filtragem de linha na cláusula WHEN apropriada. Por exemplo, WHEN NOT MATCHED AND S.EmployeeName LIKE “S%” THEN INSERT ….
  • Defina uma exibição na origem ou destino que retorne as linhas filtradas e faça referência à exibição como origem ou destino tabela. Se a visualização for definida na tabela de destino, quaisquer ações em relação a ela devem satisfazer as condições para atualização das visualizações. Para obter mais informações sobre como atualizar dados usando uma visão, consulte Modificando dados por meio de uma visão.
  • Use a cláusula WITH <common table expression> para filtrar as linhas das tabelas de origem ou destino . Este método é semelhante à especificação de critérios de pesquisa adicionais na cláusula ON e pode produzir resultados incorretos. Recomendamos que você evite usar este método ou teste completamente antes de implementá-lo.

A operação de junção na instrução MERGE é otimizada da mesma maneira que uma junção em uma instrução SELECT. Ou seja, quando o SQL Server processa associações, o otimizador de consulta escolhe o método mais eficiente (dentre várias possibilidades) de processamento da associação. Quando a origem e o destino são de tamanho semelhante e as diretrizes de índice descritas anteriormente são aplicadas às tabelas de origem e destino, um operador de junção de mesclagem é o plano de consulta mais eficiente. Isso ocorre porque ambas as tabelas são verificadas uma vez e não há necessidade de classificar os dados. Quando a origem é menor do que a tabela de destino, um operador de loops aninhados é preferível.

Você pode forçar o uso de uma junção específica especificando a cláusula OPTION (<query_hint>) em a declaração MERGE. Recomendamos que você não use a junção de hash como uma dica de consulta para instruções MERGE porque este tipo de junção não usa índices.

Práticas recomendadas de parametrização

Se um SELECT, INSERT, UPDATE ou a instrução DELETE for executada sem parâmetros, o otimizador de consulta do SQL Server pode escolher parametrizar a instrução internamente. Isso significa que quaisquer valores literais contidos na consulta são substituídos por parâmetros. Por exemplo, a instrução INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), pode ser implementada internamente como INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Esse processo, chamado de parametrização simples, aumenta a capacidade do mecanismo relacional de combinar novas instruções SQL com planos de execução existentes previamente compilados. O desempenho da consulta pode ser melhorado porque a frequência de compilações e recompilações de consulta é reduzida. O otimizador de consulta não aplica o processo de parametrização simples às instruções MERGE. Portanto, as instruções MERGE que contêm valores literais podem não ter um desempenho tão bom quanto as instruções individuais INSERT, UPDATE ou DELETE porque um novo plano é compilado sempre que a instrução MERGE é executada.

Para melhorar o desempenho da consulta, recomendamos as seguintes diretrizes de parametrização:

  • Parametrize todos os valores literais na cláusula ON <merge_search_condition> e na WHEN cláusulas da declaração MERGE. Por exemplo, você pode incorporar a instrução MERGE em um procedimento armazenado substituindo os valores literais pelos parâmetros de entrada apropriados.
  • Se você não puder parametrizar a instrução, crie um guia de plano do tipo TEMPLATE e especifique a PARAMETERIZATION FORCED dica de consulta no guia de plano.
  • Se as instruções MERGE forem executadas com frequência no banco de dados, considere definir a opção PARAMETERIZATION no banco de dados para FORCED. Tenha cuidado ao definir esta opção. A opção PARAMETERIZATION é uma configuração no nível do banco de dados e afeta como todas as consultas no banco de dados são processadas.

Melhores práticas da cláusula TOP

Na instrução MERGE, a cláusula TOP especifica o número ou a porcentagem de linhas que são afetadas depois que a tabela de origem e a tabela de destino são unidas e depois que as linhas que não se qualificam para uma ação de inserção, atualização ou exclusão são removidas . A cláusula TOP reduz ainda mais o número de linhas unidas ao valor especificado e as ações de inserção, atualização ou exclusão são aplicadas às linhas unidas restantes de maneira não ordenada. Ou seja, não existe uma ordem na qual as linhas sejam distribuídas entre as ações definidas nas cláusulas WHEN. Por exemplo, especificar TOP (10) afeta 10 linhas; dessas linhas, 7 podem ser atualizadas e 3 inseridas, ou 1 pode ser excluída, 5 atualizada e 4 inserida e assim por diante.

É comum usar a cláusula TOP para realizar a linguagem de manipulação de dados (DML ) operações em uma grande mesa em lotes. Ao usar a cláusula TOP na instrução MERGE para esse propósito, é importante entender as seguintes implicações.

  • O desempenho de E / S pode ser afetado.

    A instrução MERGE executa uma verificação completa da tabela das tabelas de origem e de destino. Dividir a operação em lotes reduz o número de operações de gravação realizadas por lote; entretanto, cada lote executará uma varredura completa da tabela de origem e destino. A atividade de leitura resultante pode afetar o desempenho da consulta.

  • Podem ocorrer resultados incorretos.

    É importante garantir que todos os lotes sucessivos visem novas linhas ou pode ocorrer um comportamento indesejado, como a inserção incorreta de linhas duplicadas na tabela de destino. Isso pode acontecer quando a tabela de origem inclui uma linha que não estava em um lote de destino, mas estava na tabela de destino geral.

  • Para garantir resultados corretos:

    • Use a cláusula ON para determinar quais linhas de origem afetam as linhas de destino existentes e quais são genuinamente novas.
    • Use uma condição adicional na cláusula WHEN MATCHED para determinar se a linha de destino já foi atualizada por um lote anterior.

Como a cláusula TOP só é aplicada depois que essas cláusulas são aplicadas, cada execução insere uma linha genuinamente não correspondida ou atualiza uma linha existente.

Práticas recomendadas de carregamento em massa

A instrução MERGE pode ser usada para carregar dados em massa com eficiência de um arquivo de dados de origem em uma tabela de destino, especificando a cláusula OPENROWSET(BULK…) como a fonte da tabela. Ao fazer isso, todo o arquivo é processado em um único lote.

Para melhorar o desempenho do processo de mesclagem em massa, recomendamos as seguintes diretrizes:

  • Crie um índice clusterizado nas colunas de junção na tabela de destino.

  • Use as dicas ORDER e UNIQUE na cláusula OPENROWSET(BULK…) para especificar como o arquivo de dados de origem é classificado.

    Por padrão, a operação em massa assume que o arquivo de dados está desordenado. Portanto, é importante que os dados de origem sejam classificados de acordo com o índice clusterizado na tabela de destino e que a dica ORDER seja usada para indicar a ordem para que o otimizador de consulta possa gerar um plano de consulta mais eficiente. As dicas são validadas em tempo de execução; se o fluxo de dados não estiver em conformidade com as dicas especificadas, um erro é gerado.

Essas diretrizes garantem que as chaves de junção sejam exclusivas e a ordem de classificação dos dados no o arquivo de origem corresponde à tabela de destino. O desempenho da consulta é aprimorado porque as operações de classificação adicionais não são necessárias e as cópias de dados desnecessárias não são exigidas.

Medindo e diagnosticando o desempenho do MERGE

Os seguintes recursos estão disponíveis para ajudá-lo a medir e diagnosticar o desempenho das instruções MERGE.

  • Use o contador merge stmt na exibição de gerenciamento dinâmico sys.dm_exec_query_optimizer_info para retornar o número de otimizações de consulta para as instruções MERGE.
  • Use o atributo merge_action_type na visão de gerenciamento dinâmico sys.dm_exec_plan_attributes para retornar o tipo de plano de execução do gatilho usado como resultado de uma instrução MERGE.
  • Use o SQL Trace para reunir dados de solução de problemas para a instrução MERGE da mesma maneira você faria para outras instruções de linguagem de manipulação de dados (DML). Para obter mais informações, consulte Rastreamento SQL.

Exemplos

A. Usando MERGE para fazer operações INSERT e UPDATE em uma tabela em uma única instrução

Um cenário comum é atualizar uma ou mais colunas em uma tabela se houver uma linha correspondente. Ou, inserir os dados como uma nova linha se não existir uma linha correspondente. Você geralmente faz qualquer um dos cenários passando parâmetros para um procedimento armazenado que contém as instruções UPDATE e INSERT apropriadas. Com a instrução MERGE, você pode executar as duas tarefas em uma única instrução. O exemplo a seguir mostra um procedimento armazenado no banco de dados AdventureWorks2012 que contém uma instrução INSERT e uma instrução UPDATE. O procedimento é então modificado para executar as operações equivalentes usando uma única instrução MERGE.

B . Usando MERGE para fazer operações UPDATE e DELETE em uma tabela em uma única instrução

O exemplo a seguir usa MERGE para atualizar a tabela ProductInventory no banco de dados de exemplo AdventureWorks2012, diariamente, com base nos pedidos processados na tabela SalesOrderDetail. A coluna Quantity da ProductInventory tabela é atualizada subtraindo o número de pedidos feitos a cada dia para cada produto no SalesOrderDetail tabela. Se o número de pedidos de um produto diminuir o nível de estoque de um produto para 0 ou menos, a linha desse produto será excluída da tabela ProductInventory.

C. Usando MERGE para fazer operações UPDATE e INSERT em uma tabela de destino usando uma tabela de origem derivada

O exemplo a seguir usa MERGE para modificar a tabela SalesReason no banco de dados AdventureWorks2012 atualizando ou inserindo linhas. Quando o valor de NewName na tabela de origem corresponde a um valor na coluna Name da tabela de destino, (SalesReason), a coluna ReasonType é atualizada na tabela de destino. Quando o valor de NewName não corresponde, a linha de origem é inserida na tabela de destino. A tabela de origem é uma tabela derivada que usa o construtor de valor da tabela Transact-SQL para especificar vários linhas para a tabela de origem. Para obter mais informações sobre como usar o construtor de valor de tabela em uma tabela derivada, consulte Construtor de valor de tabela (Transact-SQL). O exemplo também mostra como armazenar os resultados da cláusula OUTPUT em uma variável de tabela. em seguida, você resume os resultados da instrução MERGE executando uma operação de seleção simples que retorna a contagem de linhas inseridas e atualizadas.

D.Inserindo os resultados da instrução MERGE em outra tabela

O exemplo a seguir captura dados retornados da cláusula OUTPUT de uma instrução MERGE e insere esses dados em outra tabela. A instrução MERGE atualiza a coluna Quantity da tabela ProductInventory no banco de dados AdventureWorks2012, com base nos pedidos processados no SalesOrderDetail. O exemplo captura as linhas atualizadas e as insere em outra tabela que “é usada para rastrear alterações de inventário.

E. Usando MERGE para fazer INSERT ou UPDATE em uma tabela de borda de destino em um banco de dados de gráficos

Neste exemplo, você cria tabelas de nós Person e City e um tabela de borda livesIn. Use a instrução MERGE na livesIn borda e insira uma nova linha se a borda ainda não existir entre um Person e City. Se a borda já existe, basta atualizar o atributo StreetAddress na livesIn borda.

Consulte também

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *