SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Clausola OUTPUT

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!

Categoria: Transact-SQL
venerdì, 12 gen 2007 Ore. 11.13
Statistiche
  • Views Home Page: 480.836
  • Views Posts: 866.425
  • Views Gallerie: 498.895
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003