Início > Uncategorized > Comando MERGE do SQL Server 2008

Comando MERGE do SQL Server 2008

Estive recentemente adotando uso em massa do comando MERGE, novidade do SQL Server 2008, que facilita enormemente o trabalho de sincronização de dados entre tabelas. Para projetos de construção de Data Warehouses, ele economiza muitas linhas de código e simplifica muito a lógica da sincronização de dados.

Vamos direto para um exemplo prático. Suponha uma tabela Empresa de destino:

create table Empresa (
  id int not null identity(1,1)
  ,CodigoEmpresa char(2) not null
  ,NomeEmpresa varchar(100) not null
  ,CodigoFilial char(2) not null
  ,NomeFilial varchar(100) not null
  ,constraint PK_Empresa primary key (id)
)

A origem dos dados está em um arquivo SIGAMAT.EMP, de estrutura DBF, como ocorre no Sistema Microsiga. A consulta a seguir retorna os dados da origem, diretamente do arquivo DBF:

select m0_codigo as codigoEmpresa, m0_nome as nomeEmpresa, m0_codfil as codigoFilial, m0_filial as nomeFilial
from OPENROWSET(‘MSDASQL’,’Driver={Microsoft dBASE Driver (*.dbf)}; DefaultDir=C:\DBF\; SourceType=EMP’,’select * from sigamat’)

O comando MERGE para sincronizar o destino de acordo com os dados da origem fica assim:

MERGE Empresa AS dst
USING (select m0_codigo as codigoEmpresa, m0_nome as nomeEmpresa, m0_codfil as codigoFilial, m0_filial as nomeFilial from OPENROWSET(‘MSDASQL’,’Driver={Microsoft dBASE Driver (*.dbf)}; DefaultDir=C:\DBF\; SourceType=EMP’,’select * from sigamat’)
) AS src
  ON (dst.codigoEmpresa = src.codigoEmpresa and dst.codigoFilial = src.codigoFilial)
  WHEN MATCHED THEN UPDATE SET dst.NomeEmpresa = src.nomeEmpresa, dst.nomeFilial = src.nomeFilial
  WHEN NOT MATCHED BY SOURCE THEN DELETE
  WHEN NOT MATCHED THEN INSERT VALUES(codigoEmpresa, nomeEmpresa, codigoFilial, nomeFilial);

Logo em seguida ao comando MERGE é definida a tabela de destino, criando um alias (apelido), neste caso dst. Em seguida, a cláusula USING define a origem dos dados, que é a consulta ao DBF mencionada acima. Também é importante identificar a origem por um apelido, neste caso src.

A cláusula ON identifica o critério de JOIN entre origem e destino, no caso pelos campos de código de empresa e código de filial.

A cláusula WHEN MATCHED indica o que deve ser feito caso haja uma correspondência entre origem e destino (no caso, normalmente se deseja atualizar um ou mais campos).

A cláusula WHEN NOT MATCHED BY SOURCE indica o que deve ser feito quando o registro existe no destino mas não existe na origem. Quando se deseja manter o sincronismo, é preferível excluir o registro no destino, como é o caso deste exemplo.

A cláusula WHEN NOT MATCHED indica o que deve ser feito quando o registro não existe no destino. Em geral, deve-se inserir dados.

Pode-se também usar a cláusula opcional OUTPUT, para mostrar a ação executada usando a palavra-chave $action e exibindo campos das tabelas virtuais inserted e deleted, que possuem a mesma estrutura dos dados manipulados.

Este é um exemplo bastante simples, embora bastante prático e útil em nossos projetos de BI com Microsiga. O comando MERGE possibilita o tratamento de sincronização de dados em diversos outros cenários mais complexos.

Categorias:Uncategorized
  1. Bruno
    14/04/2010 às 08:08

    Muito bom, mas é meio complicado este comando para decorar a sintaxe

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: