Comando MERGE
Saiba como usar o comando
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

Subscribe ecode10.com
Receive our latest updates about programming languages, software, database, books, ebooks, classes, jobs and more.
You can cancel anytime.
Log In
Related articles
Creating a SiteMap using SQL Database
Como indexar melhor meu site e links?
Transformando linhas em colunas usando SQL Server
veja como funciona
Comando LEFT no database
veja como