Fábio 的个人资料The Opera Summary日志列表网络 工具 帮助

日志


10月17日

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.

10月2日

Rosario e SQL Server 2008 Setup

A Microsoft apresentará este mês um CTP (Community Technology Preview) na PDC (Professional Developers' Conference) para o "Rosario", ou Visual Studio 2010. Chama a atenção o destaque para metodologias ágeis de desenvolvimento, .NET Framework 4.0 e uso do mecanismo do Reporting Services 2008. Mais detalhes em:

http://reddevnews.com/news/devnews/article.aspx?editorialsid=1145

Como solucionar problemas de instalação do SQL Server 2008 antes de rodar o setup.exe:

http://blogs.msdn.com/psssql/archive/2008/09/30/how-to-fix-your-sql-server-2008-setup-before-you-run-setup.aspx