2012-06-12 5 views
163

Se ho una dichiarazione inserto come ad esempio:Come utilizzare una clausola OUTPUT dell'istruzione INSERT per ottenere il valore dell'identità?

INSERT INTO MyTable 
( 
    Name, 
    Address, 
    PhoneNo 
) 
VALUES 
(
    'Yatrix', 
    '1234 Address Stuff', 
    '1112223333' 
) 

Come faccio a impostare @var INT al valore di identità della nuova riga (chiamato Id) utilizzando la clausola di uscita? Ho visto esempi di inserimento di INSERTED.Name in variabili di tabella, ad esempio, ma non riesco a inserirlo in una variabile non di tabella.

Ho provato OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, ma nessuno dei due ha funzionato.

+2

Conosco già @@ SCOPE_IDENTITY, in particolare voglio sapere come farlo con OUPUT. Grazie. – Yatrix

+6

È necessario inserirlo in una variabile di tabella, quindi selezionare da quello. Non c'è sintassi da assegnare direttamente a una variabile scalare dalla clausola 'OUTPUT'. –

+3

La clausola [OUTPUT] (http://msdn.microsoft.com/en-us/library/ms177564.aspx) deve essere stampata in una tabella o variabile di tabella. – mellamokb

risposta

320

È possibile avere l'uscita ID appena inserito essendo alla console SSMS come questo:

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

È possibile utilizzare questo anche da esempio C#, quando è necessario richiamare l'ID nell'app di chiamata: è sufficiente eseguire la query SQL con .ExecuteScalar() (anziché .ExecuteNonQuery()) per leggere il risultante ID indietro.

Oppure, se avete bisogno di catturare l'appena inserito ID all'interno T-SQL (ad esempio, per l'ulteriore elaborazione in seguito), è necessario creare una variabile di tabella:

DECLARE @OutputTbl TABLE (ID INT) 

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID INTO @OutputTbl(ID) 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

In questo modo, è possibile inserire più valori in @OutputTbl e fare ulteriori elaborazioni su quelli. Puoi anche utilizzare una tabella temporanea "normale" (#temp) o anche una tabella persistente "reale" come "destinazione di output" qui.

+2

La risposta qui per il codice era concisa. ExecuteScalar() FTW –

+5

Puoi inserire il risultato in una 'tabella persistente reale '- questo è estremamente fantastico perché significa che puoi' INSERIRE 'le informazioni nelle tabelle' DUE' allo stesso tempo. – gotqn

+2

Non utilizzare mai @@ IDENTITY per tirare dall'alto. Ho lavorato duro con i trigger e dato che stavano registrando la cronologia delle modifiche apportate a una tabella e inserendole in una nuova tabella allo stesso tempo, @@ IDENTITY ha iniziato a restituire i valori dalla tabella della cronologia. l'ilarità segue da lì! Si prega di utilizzare la soluzione di marc_s. per il momento sono andato con il metodo @OutputTbl, ma sono affascinato dalle altre opzioni. –

Problemi correlati