SQL Server OUTPUT clause restituisce i valori di ogni riga interessata da istruzioni INSERT, UPDATE o DELETE.
La clausola Output restituisce una copia dei dati che possono essere inseriti in una tabella separata durante l’esecuzione della query.
Questa clausola è più comunemente utilizzata per tenere traccia della modifica dei dati nella tabella a scopo di audit.
La clausola OUTPUT dà accesso a due tabelle virtuali come indicato di seguito.
- INSERITO che contiene le nuove righe (INSERT o UPDATE)
- CANCELLATO che contiene la vecchia copia delle righe (vuota per INSERT)
La clausola OUTPUT può accedere a tutte le colonne della tabella, anche quelle che non fanno parte dell’istruzione Insert .
SINTASSI
---- for insertINSERT INTO tablename OUTPUT inserted . *INTO @output_tablenameVALUES (col_value1 ,col_value2 ,..) ---for delete DELETE FROM tablenameOUTPUT deleted.* INTO @output_tablename WHERE Condition
CREATE TABLE dbo.Item (ItemId Int identity(1,1),ItemName Varchar(20),ItemPurchasedDate Datetime)
Utilizzando la clausola Output con Insert
Per inserire la clausola output risultato in una tabella , Prima di dichiarare una variabile di tabella per memorizzare il risultato di clausola output ,e utilizzare l’uscita caluse sintassi per memorizzare il risultato in una variabile di tabella .
Per accedere ai record inseriti, la clausola Output utilizza la tabella virtuale inserita che contiene le nuove righe.
Nel seguente dichiarazione: possiamo inserire un record nella tabella Articolo e utilizzare la clausola output per memorizzare i record in una tabella variabile @insert_log, come indicato di seguito.
DECLARE @insert_log TABLE(ItemId Int, ItemName Varchar(20), ItemPurchasedDate Datetime )INSERT INTO dbo.Item OUTPUT inserted.ItemId, inserted.ItemName, inserted.ItemPurchasedDateINTO @insert_logVALUES ('Item1' , Getdate()) SELECT * FROM dbo.Item;SELECT * FROM @insert_log ;
Come si può vedere il risultato di un Elemento della tabella e tabella variabile, Durante l’inserimento di nuovi record in tabella articolo, ItemId non è parte dell’istruzione insert . Tuttavia, è possibile accedere alla colonna ItemId nella clausola OUTPUT.
Utilizzando l’output caluse con l’istruzione Update
Per accedere ai record aggiornati, è possibile utilizzare la tabella virtuale inserita o eliminata con la clausola output secondo le proprie esigenze.
Se si desidera accedere a un vecchio valore che era prima di aggiornare il nuovo valore, è possibile utilizzare la tabella virtuale eliminata e se si desidera accedere a nuovi valori aggiornati, è possibile utilizzare la tabella virtuale inserita con la clausola di output.
Nella seguente istruzione, aggiorniamo il valore ItemName nella tabella Item e usiamo la clausola output per memorizzare i vecchi valori per quei record in una variabile di tabella @update_log.
Poiché vogliamo accedere ai vecchi record, usiamo la tabella virtuale eliminata.
DECLARE @update_log TABLE( ItemId int, ItemName Varchar(20), ItemPurchasedDate Datetime )UPDATE dbo.Item SET ItemName ='Item2'OUTPUT deleted.ItemId, deleted.ItemName, deleted.ItemPurchasedDateINTO @update_logWHERE ItemId =1SELECT * FROM dbo.Item;SELECT * FROM @update_log
Come puoi vedere, qui abbiamo tre output come segue
1: È l’output della tabella prima di aggiornare i record.
2: È l’output della tabella dopo l’aggiornamento dei record.
3: È l’output restituito dalla variabile table che contiene i vecchi valori dei record che erano prima dell’aggiornamento.
Se si desidera accedere a nuovi record, è possibile utilizzare la tabella virtuale inserita al posto di deleted.
Clausola di output con l’istruzione Delete
La seguente istruzione utilizza la query delete per eliminare il record per ItemId= 1 dalla tabella Item e memorizzare i record eliminati nella variabile table utilizzando l’Output caluse .
Per accedere alla clausola output dei record eliminati utilizzare la tabella virtuale eliminata che contiene la vecchia copia delle righe.
DECLARE @delete_log TABLE( ItemId Int, ItemName Varchar(20), ItemPurchasedDate Datetime )DELETE FROM dbo.Item OUTPUT deleted.ItemId, deleted.ItemName, deleted.ItemPurchasedDateINTO @delete_logWHERE ItemId =1SELECT * FROM dbo.Item;SELECT * FROM @delete_log
Come potete vedere , non C’è nessun dato disponibile punto tabella che viene eliminato, ma la clausola output inserti eliminati i record in una tabella variabile @delete_log, che è molto utile per tenere traccia dei record cancellati.
Consigliato per te
Tabelle temporali di SQL Server
822 visualizzazioni totali, 8 visualizzazioni oggi