Arquivo
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.
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: