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
$action, COALESCE(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