Avevo già accennato in un mio precedente post l'utilizzo della clausola OUTPUT..
qui di seguito il link su msdn
http://msdn2.microsoft.com/en-us/library/ms177564.aspx
Si tratta di una possibilità che sql server 2005 ci dà a mio avviso molto importante. Possiamo infatti monitorare quello che abbiamo inserito, modificato o cancellato.
Infatti, la clausola output è disponibile solo per i comandi DML (Data Manipulation Language) e quindi solo per quei comandi che "modificano" il contenuto delle nostre tabelle. Qui di seguito un esempio che potrebbe tornare utile a qualcuno. Ovviamente è il più generico possibile, in modo da poterlo riutilizzare
USE TempDB
-- creo un'ipotetica tabella delle testate
CREATE TABLE #TempTestata
(
IDTestata int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
Data smalldatetime DEFAULT(GETDATE()),
Descrizione varchar(100)
) ON [PRIMARY]
-- creo un'ipotetica tabella dei dettagli
CREATE TABLE #TempDettaglio
(
IDTestata int,
IDRiga int IDENTITY(1,1),
Descrizione varchar(100),
CONSTRAINT PK_TempDettaglio PRIMARY KEY CLUSTERED
(
IDTestata,
IDRiga
) ON [PRIMARY]
) ON [PRIMARY]
-- tabella che immagazzina i cancellati
CREATE TABLE #Cestino
(
IDTestata int PRIMARY KEY CLUSTERED,
Data smalldatetime DEFAULT(GETDATE()),
Descrizione varchar(100)
) ON [PRIMARY]
-- popolamento tabelle
INSERT #TempTestata (Data,Descrizione)
SELECT '20070110 11:00','PROVA UNO'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070111 11:00','PROVA DUE'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070112 11:00','PROVA TRE'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070113 11:00','PROVA QUATTRO'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070114 11:00','PROVA CINQUE'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070115 11:00','PROVA SEI'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070116 11:00','PROVA SETTE'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070117 11:00','PROVA OTTO'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070118 11:00','PROVA NOVE'
INSERT #TempTestata (Data,Descrizione)
SELECT '20070119 11:00','PROVA DIECI'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 1,'PROVA UNO - DETTAGLIO 1'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 1,'PROVA UNO - DETTAGLIO 2'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 1,'PROVA UNO - DETTAGLIO 3'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 2,'PROVA DUE - DETTAGLIO 1'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 2,'PROVA DUE - DETTAGLIO 2'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 2,'PROVA DUE - DETTAGLIO 3'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 9,'PROVA NOVE - DETTAGLIO 1'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 9,'PROVA NOVE - DETTAGLIO 2'
INSERT #TempDettaglio (IDTestata,Descrizione)
SELECT 9,'PROVA NOVE - DETTAGLIO 3'
-- elenco delle testate aventi dettagli
SELECT
*
FROM
#TempTestata T
JOIN #TempDettaglio TD
ON T.IDTestata = TD.IDTestata
-- cancello le testate che non hanno dettagli
DELETE FROM #TempTestata
OUTPUT DELETED.* INTO #Cestino --> inserisco i dati cancellati nella tabella "cestino"
FROM #TempTestata T
LEFT JOIN #TempDettaglio TD
ON T.IDTestata = TD.IDTestata
WHERE
TD.IDTestata IS NULL
SELECT * FROM #Cestino
-- pulisco
DROP TABLE #TempTestata
DROP TABLE #TempDettaglio
DROP TABLE #Cestino
Possiamo notare come è possibile con una semplice clausola, mantenere i dati "validi" per un certo periodo, in modo da non perderli subito. La tabella Cestino (che è una temporanea, ma può essere anche una tabella fisica o una variabile tabella), conterrà i dati fino a che non si vuole realmente scartare tutto il set di dati. Può essere utile utilizzare questi dati anche a scopo di log o per la creazione di messaggi di ritorno personalizzati.
N.B. Tutto l'esempio è valido anche con tabelle non temporanee
Stay tuned!