Guida per principianti alla clausola OUTPUT in SQL Server

T-SQL supporta la clausola OUTPUT dopo l'inizio di SQL Server 2005 e versioni successive. Possiamo usare la clausola OUTPUT con istruzioni DML (INSERT, DELETE, UPDATE) per restituire informazioni da righe modificate.

Utilizziamo principalmente la clausola OUTPUT per il controllo e l'archiviazione di righe modificate. In questo tutorial, illustreremo l'uso della clausola OUTPUT con diverse istruzioni ed esempi DML. In primo luogo, creeremo un tavolo, dbo.Songse popolarlo con alcuni dati.

IF OBJECT_ID ('dbo.Songs') NON È NULL DROP TABLE dbo.Songs GO CREATE TABLE dbo.Songs (Id int CONSTRAINT PK_Songs_Id PRIMARY KEY, Nome varchar (200) NOT NULL, Singer varchar (50) NOT NULL) GO INSERT INTO dbo.Songs (Id, Name, Singer) VALORI (1, 'Odio tutto di te', 'Adam Gontier'); INSERISCI IN Dbo.Songs (Id, Name, Singer) VALORI (2, 'Dil se', 'A. R. Rahman'); INSERISCI IN Dbo.Songs (Id, Name, Singer) VALORI (3, 'My heart will on On', 'Celine Dion'); INSERISCI IN Dbo.Songs (Id, Name, Singer) VALORI (4, 'Maeri', 'Euphoria'); GO SELECT * da dbo.Songs GO



Tabelle inserite ed eliminate in una clausola OUTPUT

Le tabelle inserite e cancellate sono due tabelle residenti in memoria che risiedono all'interno del server SQL e vengono utilizzate con la clausola OUTPUT.

Ogni volta che viene eseguita un'istruzione DML (INSERT, DELETE, UPDATE), queste tabelle vengono popolate.

I risultati dell'istruzione INSERT sono memorizzati nella tabella inserted e i risultati dell'istruzione Delete sono memorizzati nella tabella Deleted. Inoltre, con un'istruzione UPDATE, le righe eliminate vengono archiviate nella tabella Eliminata. Le nuove righe inserite nella tabella Inserita come UPDATE non sono altro che cancellare e inserire operazioni combinate insieme.

Nota: non è possibile interrogare direttamente le tabelle inserite e cancellate per vedere quali dati sono attualmente in attesa, ma è possibile utilizzarli con la clausola OUTPUT e con i trigger.


La clausola OUTPUT con un'istruzione Insert

Quando facciamo un'operazione Insert su una tabella, otteniamo un messaggio che dice "(n row (s) affected)", ma se vogliamo vedere quali righe di dati sono state inserite in una tabella, possiamo usare una clausola OUTPUT e una tabella inserita residente in memoria per riportare i risultati sullo schermo come fa un'istruzione select.

Inseriamo un record e usiamo una clausola OUTPUT per stampare i risultati sullo schermo.

INSERISCI IN Dbo.Songs (Id, Name, Singer) OUTPUT INSERTED.ID, INSERTED.name, INSERTED.Singer VALUES (5, 'AINT no grave', 'Johnny Cash'); PARTIRE


Controlla la tabella dbo.Songs. Una nuova riga viene inserita con id = 5.

seleziona * da dbo.Songs; PARTIRE



La clausola OUTPUT con un'istruzione Delete

Lo stesso vale con un'operazione di cancellazione. Mostra solo (n righe interessate). Possiamo usare una clausola OUTPUT e una tabella cancellata per vedere quali righe sono state effettivamente cancellate dalla tabella.

CANCELLA da dbo.Songs OUTPUT DELETED.id, DELETED.name, DELETED.singer WHERE ID = 5; PARTIRE


Interroga la riga della tabella dbo.Songs con id = 5 è stata eliminata.

seleziona * da dbo.Songs; PARTIRE



La clausola OUTPUT con una dichiarazione di aggiornamento

Un'istruzione Update non fa altro che eliminare vecchi dati e inserire nuovi dati, quindi con un'istruzione Update, entrambe le tabelle residenti in memoria sono interessate e vengono eliminate e inserite.

Qui stiamo aggiornando il nome di un cantante, che ha cantato la canzone 'Dil se', con ID uguale a due.

UPDATE dbo.Songs SET Singer = 'Rahman' OUTPUT DELETED.Singer, INSERTED.Singer WHERE ID = 2; PARTIRE


Puoi vedere il nome del vecchio cantante insieme al nome del nuovo cantante.

seleziona * da dbo.Songs;


I tre esempi sopra mostrano come usare una clausola OUTPUT a fini di controllo. Ora vedremo come usarlo per l'archiviazione.

Prima stavamo stampando i risultati di un'istruzione DML sullo schermo, che era temporanea, ma con la clausola OUTPUT, è possibile memorizzare anche i risultati di un'istruzione DML in una tabella.


Memorizza i risultati di una clausola OUTPUT in una tabella

L'inserimento del ritorno dei dati da una clausola OUTPUT in una tabella può essere eseguito utilizzando una clausola OUTPUT INTO. Tieni presente che devi prima creare la tabella di destinazione che deve avere lo stesso numero di colonne e tipi di dati che corrispondono alla tabella di origine.

IF OBJECT_ID ('dbo.Songs_Inserted') NON È NULL DROP TABLE dbo.Songs_Inserted GO CREATE TABLE dbo.Songs_Inserted (Id int CONSTRAINT PK_Songs__Inserted_Id PRIMARY KEY, Nome varchar (200) NOT NULL, Singer varchar (50) NOT NULL) GO INSERT INTO dbo.Songs (Id, Name, Singer) OUTPUT inserito. * INTO dbo.Songs_Inserted VALUES (5, 'Duniya', 'Piyush Mishra'); GO - Risultato di Songs_Inserite tabella e tabella di base. seleziona * da dbo.Songs_Inserted; seleziona * da dbo.Songs; PARTIRE


Come mostrano i risultati sopra, i dati vengono inseriti in entrambe le tabelle.


Memorizza i risultati di una clausola OUTPUT in una tabella temporanea

Lo stesso vale per una tabella temporanea. Creare prima una tabella temporanea e quindi utilizzare una clausola OUTPUT INTO, inserire i dati restituiti dalla clausola OUTPUT in una tabella temporanea.

IF OBJECT_ID ('tempdb ... #Songs_Deleted') NON È NULL DROP TABLE dbo. # Songs_Deleted GO CREATE TABLE dbo. # Songs_Deleted (Id int, Name varchar (200) NOT NULL, Singer varchar (50) NOT NULL) GO DELETE da dbo .Songs OUTPUT cancellato. * INTO dbo. # Songs_Deleted WHERE ID IN (4,5); GO - Risultato della tabella temporanea e della tabella di base. SELECT * from dbo. # Songs_Deleted; Seleziona * da dbo.Songs;



Memorizza i risultati di una clausola OUTPUT in una variabile di tabella

Nulla cambia anche per le variabili di tabella. Dichiarare una struttura di variabili di tabella uguale a una tabella di origine. Non dimenticare di eseguire l'intero script contemporaneamente in modo da poter vedere l'output inserito in una variabile di tabella.

Dichiara @Songs_Deleted TABLE (Id int, Name varchar (200) NOT NULL, Singer varchar (50) NOT NULL) DELETE da dbo.Songs OUTPUT eliminato. * INTO @Songs_Deleted WHERE ID IN (1,2); - Risultato della variabile di tabella SELECT * from @Songs_Deleted;


Sfoglia i nostri articoli di archivio del server SQL per ulteriori informazioni utili.