Vamos ver um pouco sobre um novo comando do SQL Server 2008, o MERGE.

O Merge veio pra nos ajudar em rotinas de insert/update/delete.
Neste exemplo vamos manter uma tabela OLAP atualizada, inserindo novos registros, atualizando os existentes e excluindo os que não existem mais. Vamos também criar uma tabela de log para termos um controle das ações.

Crição do Ambiente:
CREATE TABLE ChequeOLTP
(
  ID int primary key,
  Data date,
  Valor decimal(9,2)
)
 
CREATE TABLE ChequeOLAP
(
  ID int primary key,
  Data date,
  Valor decimal(9,2)
)
 
CREATE TABLE LogCheque
(
  Acao varchar(10),
  ID int,
  Data datetime
)
 
INSERT INTO ChequeOLTP VALUES(1,'2012-01-10',120),(3,'2012-01-22',240),(4,'2012-02-05',97),(5,'2012-02-08',72),(6,'2012-01-07',148)
INSERT INTO ChequeOLAP VALUES(1,'2012-01-15',120),(2,'2012-01-15',150),(3,'2012-01-22',220),(4,'2012-02-05',97),(5,'2012-02-08',72)


Dividi o comando MERGE em 3 partes:
A primeira parte é a definição das tabelas destino/origem e suas relações
Segunda parte é definição das ações:
-Quando houver a combinação(WHEN MATCHED)
-Quando não existir no destino(WHEN NOT MATCHED BY TARGET)
-Quando não existir na origem(WHEN NOT MATCHED BY SOURCE)
Terceira parte é a saida


MERGE INTO ChequeOLAP AS Dest
USING ChequeOLTP AS Orig
ON Dest.ID = Orig.ID
WHEN MATCHED THEN
         UPDATE
         SET Dest.Valor = Orig.Valor,
                 Dest.Data = Orig.Data
WHEN NOT MATCHED BY TARGET THEN
          INSERT (ID, Data, Valor)
          VALUES (Orig.ID, Orig.Data, Orig.Valor)
WHEN NOT MATCHED BY SOURCE THEN
         DELETE
OUTPUT
          $actionCOALESCE(deleted.ID, inserted.ID) ID, getdate() INTO LogCheque;


Vamos ver o Log:
SELECT FROM LogCheque

 
Quantitativo do Log:
SELECT Acao, COUNT(*) QTD
FROM LogCheque
GROUP BY Acao