Procedure que cria script de merge dinamico com apenas alguns parametros.

 Olá pessoal, espero que estejam todos bem! Hoje gostaria de compartilhar uma procedure que fiz para automatizar o processo de merge que volta e meia aparece para fazer.

O script é bem simples e versátil, nele você pode passar os seguintes parâmetros:


@table_source            = Tabela de origem

@table_target             =  Tabela destino

@cols_key                 = Aqui você pode passar as colunas que são chaves para o merge (caso seja uma chave composta basta passar as colunas separadas por VIRGULA) Ex: 'COL1,COL2,COL3'  

@schema_table_source    = Passar o schema da tabela origem por padrão o schema é dbo

@schema_table_target     = Passar o schema da tabela destino por padrão o schema é dbo

@name_base_table_source  = Nome da base da tabela origem

@name_base_table_target  = Nome da base da tabela destino

@usar_pk_como_chave     = Nessa parametro voce pode passar S ou N, caso passe S, o merge será feito usando a primary key como chave

@string_linked_server   = Nesse parametro voce pode passar o nome do linked server da tabela origem, caso tenha um linked server, se não tiver deixei NULL


Agora que conhecemos os parâmetros da rotina, vamos ao que ela se propõe a fazer:
O dado que existir na origem e não existir no destino ela insere no destino;  
O dado que estiver diferente entre a origem e o destino, ela faz um update no destino para equalizar;  
O dado que não existir na origem e existir no destino, ela deleta do destino;

Observação importante, as tabelas origem e destino precisam ter a mesma estrutura (nome e quantidade de colunas)

Exemplo de utilização:



Por motivos de segurança e validação, deixei com que essa procedure retorne o script do merge, assim você pode validar antes de rodar na base :)

Obs: Ela não executa o script, ela mostra ele no grid

merge 
Northwind.dbo.vendas_2 as  destino
using Northwind.dbo.Dim_Venda as origem
on (Origem.Id_Venda = Destino.Id_Venda )
 WHEN MATCHED THEN UPDATE SET 
  Destino.Dt_Venda   = Origem.Dt_Venda
 ,Destino.Id_Produto = Origem.Id_Produto
 ,Destino.Quantidade = Origem.Quantidade
 ,Destino.Valor      = Origem.Valor
WHEN NOT MATCHED THEN INSERT VALUES(origem.Id_Venda,origem.Dt_Venda,origem.Id_Produto,origem.Quantidade,origem.Valor)
 WHEN NOT MATCHED BY SOURCE THEN  
    DELETE;



Bem simples né pessoal? mas espero que ajude bastante pessoas! Abraços e até a próxima!







Comentários

Postagens mais visitadas deste blog

Tuning no Postgres utlizando View Materializada

Como realizei um tuning que caiu o tempo de execução de 8h para 7minutos!

Procedure que cria um script de insert.