La novità sicuramente più interessante, mostrata oggi durante il workshop UGISS, è relativa all'operatore MERGE.
Ovvero alla possibilità di eseguire, simultaneamente, differenti istruzioni DML.
Uno degli utilizzi tipici riguarda tutti quei casi in cui si rendono necessarie delle operazioni di upsert (insert di record se non esistono, update se esistono). Operazioni che oggi dobbiamo necessariamente fare a mano, proprio con una somma di insert e update.
Vi lascio subito l'esempio mostrato:
--------------------------------------------------------
-- Inizio Script
--------------------------------------------------------
USE master
GO
-- Cancellazione db, se esiste
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'UGISS')
DROP DATABASE UGISS
GO
CREATE DATABASE UGISS
GO
USE UGISS
GO
-- creo tabella prodotti (è la mia tabella di produzione)
CREATE TABLE Prodotti
(
codice char(4) primary key,
descrizione varchar(35),
qta decimal(10,2)
)
go
-- creo la tabella di appoggio (è la mia tabella di staging)
CREATE TABLE tmpProdotti
(
codice char(4) primary key,
descrizione varchar(35),
qta decimal(10,2)
)
go
-- inserimento valori su tabella di produzione
insert Prodotti values ('AZTN','111111',12.10)
insert Prodotti values ('MSFT','222222',22.00)
insert Prodotti values ('ABCD','333333',4.56)
insert Prodotti values ('XXXX','999999',8)
-- inserimento valori su tabella di staging
insert tmpProdotti values ('AZTN','111111',8.10)
insert tmpProdotti values ('MSFT','222222',24.20)
insert tmpProdotti values ('ABCD','333333',4.56)
insert tmpProdotti values ('DEFG','444444',8.16)
insert tmpProdotti values ('XXXX','999999',-8)
-- Vedo le tabelle di partenza
select * from Prodotti
select * from tmpProdotti
-- Sincronizzazione delle tabelle
MERGE Prodotti S -- tabella target
USING tmpProdotti T -- tabella source
ON S.codice = T.codice
WHEN MATCHED AND (S.qta + T.qta = 0) THEN
DELETE
WHEN MATCHED THEN
UPDATE SET
S.qta = T.qta,
S.descrizione = T.descrizione
WHEN NOT MATCHED THEN
INSERT VALUES (codice, descrizione, qta)
-- output: vedo i dettagli di INSERT/UPDATE/DELETE
-- eseguiti sulla tabella target
OUTPUT $action, inserted.codice, inserted.qta [ins qta], deleted.qta [del qta];
-- Vedo le tabelle sincronizzate
select * from Prodotti
select * from tmpProdotti
--------------------------------------------------------
-- Fine Script
--------------------------------------------------------