Il modo migliore per ottenere l'identità della riga inserita?

Qual è il modo migliore per ottenere l'IDENTITÀ della riga inserita?

So di @@IDENTITY e IDENT_CURRENT e SCOPE_IDENTITY ma non capisco i pro e i contro legati a ciascuno.

Qualcuno può spiegare le differenze e quando dovrei usarle?

Soluzione
  • @@IDENTITY restituisce l'ultimo valore di identità generato per qualsiasi tabella nella sessione corrente, attraverso tutti gli scopi. Dovete stare attenti qui, poiché è attraverso gli scopi. Potreste ottenere un valore da un trigger, invece che dalla vostra dichiarazione corrente.

  • SCOPE_IDENTITY() restituisce l'ultimo valore di identità generato per qualsiasi tabella nella sessione corrente e nell'ambito corrente. Generalmente quello che volete usare.

  • IDENT_CURRENT('tableName')]3 restituisce l'ultimo valore di identità generato per una specifica tabella in qualsiasi sessione e in qualsiasi ambito. Questo vi permette di specificare da quale tabella volete il valore, nel caso in cui le due precedenti non siano proprio quello di cui avete bisogno (molto raro). Inoltre, come @Guy Starbuck ha menzionato, "Si potrebbe usare questo se si vuole ottenere il valore corrente di IDENTITY per una tabella in cui non è stato inserito un record;

  • La clausola OUTPUT dell'istruzione INSERT ti permetterà di accedere ad ogni riga che è stata inserita tramite quell'istruzione. Dal momento che è limitato all'istruzione specifica, è più semplice delle altre funzioni di cui sopra. Tuttavia, è un po' più prolisso (è necessario inserire in una tabella variabile/temp table e poi eseguire una query) e fornisce risultati anche in uno scenario di errore in cui l'istruzione è stata annullata. Detto questo, se la vostra query utilizza un piano di esecuzione parallelo, questo è il solo metodo garantito per ottenere l'identità (a parte disattivare il parallelismo). Tuttavia, viene eseguito prima dei trigger e non può essere utilizzato per restituire valori generati dai trigger.

Commentari (14)

MSDN

@@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT sono funzioni simili in quanto restituiscono l'ultimo valore inserito nella colonna IDENTITY di una tabella.

@@IDENTITY e SCOPE_IDENTITY restituiscono l'ultimo valore di identità generato in qualsiasi tabella nella sessione corrente. Tuttavia, SCOPE_IDENTITY restituisce il valore solo nell'ambito corrente; @@IDENTITY non è limitato ad un ambito specifico.

IDENT_CURRENT non è limitato dall'ambito e dalla sessione; è limitato a una tabella specifica. IDENT_CURRENT restituisce il valore di identità generato per una specifica tabella in qualsiasi sessione e in qualsiasi ambito. Per maggiori informazioni, vedere IDENT_CURRENT.

  • IDENT_CURRENT]2 è una funzione che prende una tabella come argomento.
  • @@IDENTITY]3 può restituire un risultato confuso quando si ha un trigger sulla tabella
  • SCOPE_IDENTITY è il tuo eroe la maggior parte delle volte.
Commentari (0)

@@IDENTITY è l'ultima identità inserita usando la corrente SQL Connection. Questo è un buon valore da restituire da una stored procedure di inserimento, dove avete solo bisogno dell'identità inserita per il vostro nuovo record, e non vi importa se altre righe sono state aggiunte in seguito.

SCOPE_IDENTITY è l'ultima identità inserita usando la corrente SQL Connection, e nell'ambito corrente -- cioè, se ci fosse una seconda IDENTITY inserita sulla base di un trigger dopo il tuo inserimento, non si rifletterebbe in SCOPE_IDENTITY, solo l'inserimento che hai eseguito. Francamente, non ho mai avuto motivo di usarlo.

IDENT_CURRENT(tablename) è l'ultima identità inserita indipendentemente dalla connessione o dall'ambito. Potresti usarlo se vuoi ottenere il valore corrente di IDENTITY per una tabella in cui non hai inserito un record.

Commentari (2)