terça-feira, 6 de julho de 2010

Funcionalidades do SQL 2008 - Usando o comando MERGE

Entre as novas funcionalidades do T-SQL na versão 2008, existe o comando MERGE, que junto com o CDC, proporciona funcionalidades de sincronização de dados entre ambientes de Stage e DataWarehouses com muita simplicidade e diversas funcionalidades. Seguindo o padrão de learn by doing it, vamos estudar um exemplo desta funcionalidade, baseado no banco de dados NorthWind, distribuído junto com instalações do Sql Server 2000.
Primeiro, vamos criar uma tabela CustomersHistory,  uma tabela com a mesma estrutura da tabela Customers porém com um campo a mais denominado Cancelled, do tipo bit.
CREATE TABLE [dbo].[CustomersHistory](
      [CustomerID] [nchar](5) NOT NULL,
      [CompanyName] [nvarchar](40) NOT NULL,
      [ContactName] [nvarchar](30) NULL,
      [ContactTitle] [nvarchar](30) NULL,
      [Address] [nvarchar](60) NULL,
      [City] [nvarchar](15) NULL,
      [Region] [nvarchar](15) NULL,
      [PostalCode] [nvarchar](10) NULL,
      [Country] [nvarchar](15) NULL,
      [Phone] [nvarchar](24) NULL,
      [Fax] [nvarchar](24) NULL,
      [Cancelled] [bit] NULL
)

A sintaxe do comando MERGE, envolve a definição de tabelas origem e destino, critérios de comparação e ações caso os critérios coincidam ou não:
    MERGE <Tabela-Alvo> AS target
    USING <Tabela-Origem> AS source
    ON (target.campoChave = source.campoChave)
    WHEN MATCHED THEN --Quando as chaves coincidem
        UPDATE SET Name = source.Name
WHEN NOT MATCHED THEN /*Quando as chaves não coincidem, ou seja, novos registros*/  
        INSERT (campo1,campo2)
        VALUES (source.campo1, source.campo2)

Podemos definir diversos critérios para os comandos MATCHED e NOT MATCHED, adequando a regra de negócio. Imagine que queremos capturar as mudanças de valores do campo Freight da tabela Customers, e toda vez que este campo for alterado vamos setar o campo Cancelled para 1, além de inserir os registros na tabela histórico caso o registro não esteja na tabela. Nossa codificação pode ser assim:
MERGE INTO CustomersHistory as CSH
      USING Customers AS CS
      ON CSH.CustomerID = CS.CustomerID
WHEN NOT MATCHED BY TARGET THEN
      INSERT ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])
      VALUES ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])
WHEN NOT MATCHED BY SOURCE THEN
      UPDATE SET CSH.CANCELLED=1
WHEN MATCHED AND (CSH.Region<>CS.Region) THEN
      UPDATE SET CSH.CANCELLED=1;
Na primeira execução, todos os dados da tabela Customers, serão copiados para a tabela CustomersHistory, porém com o campo Cancelled com o valor null. Agora vamos atualizar a tabela Customers com valores no campo Freight:
UPDATE      Customers
SET         Region = 'YY'
WHERE Region IS NOT NULL
Agora quando executarmos o merge, os campos alterados, ficarão com o campo Cancelled igual 1.
Até a próxima!

Nenhum comentário:

Postar um comentário

Leave your comment here!