[Daily Issue] @@IDENTITY, SCOPE_IDENTITY e ... IDENT_CURRENT

Trovo ancora molte perplessità riguardo all'utilizzo delle funzioni T-SQL citate nel  titolo...Quasi tutti conoscono la prima, alcuni anche la seconda, ma non capiscono bene cosa differisca dalla prima (e quindi essendo piu semplice la prima vanno con quella :P), quasi nessuno conosce la terza....

Quindi, vediamo di fare un pò chiarezza con il loro utilizzo:

@@IDENTITY
http://msdn2.microsoft.com/en-us/library/aa933167(SQL.80).aspx

Restituisce l'ltimo ID autogenerato all'interno  di una certa sessione, ma non è limitato dallo scope. Quindi restituisce l'ultimo ID autogenerato dalla sessione anche se è stato generato da un qualcosa (trigger/function) esterna per esempio alla stored procedure attuale. Quindi potremmo fare un insert su una tabella che ha un  trigger su un'altra tabella, ed avere indietro l'ID di questa seconda tabella!

Questa funzione restituisce NULL se non sono state generate identity,  e restituisce l'ultima se ne sono state generate piu di una.

SCOPE_IDENTITY
http://msdn2.microsoft.com/en-us/library/Aa259185(SQL.80).aspx

Simile alla @@Identity, ma limitata allo scope corrente. Questo vuol dire che se sono all'interno di una stored/funzione/batch e genero un identity, qualsiasi altro identity generato da qualcosa (funzioni, trigger) _esterne_ allo scope attuale verrà ignorato.

Per il resto, si comporta esattamente come @@Identity

IDENT_CURRENT
http://msdn2.microsoft.com/en-us/library/Aa933217(SQL.80).aspx

Il fratellino bistrattato delle prime due, invece, non lo conosce nessuno...
Questa funzione restituisce l'ultimo identity generato all'interno di una particolare tabella, indipendentemente dallo Scope e dalla sessione corrente.

L'uttilizzo è IDENT_CURRENT('tablename'), e bisogna stare attenti ad utilizzarlo perchè, visto che non è limitato all'interno della sessione, potrebbe succedere che se io inserisco qualcosa in una tabella, poi faccio qualche operazione, e quindi utilizzo IDENT_CURRENT per prendere l'identity generato... potrei ritrovarmi l'identity derivante dall'inserimento di un'altra stored procedure :)

2 Comments Filed Under [ Weekly Issues ]

Comments

# re: [Daily Issue] @@IDENTITY, SCOPE_IDENTITY e ... IDENT_CURRENT
Gravatar Due appunti per IDENT_CURRENT:

1) Se inserisco un record in una tabella e tra l'inserimento e la chiamata a IDENT_CURRENT un altro utente ha inserito un nuovo record nella tabella il valore restituito è quello del record inserito dal secondo utente.

2) Non vorrei sbagliarmi ma al contrario delle altre due IDENT_CURRENT se non è mai stato inserito alcun record nella tabella ritorna ugualmente 1

IMHO più che stare attenti ad utilizzarlo bisogna evitarlo come la peste :-)
Left by David on 09/11/2007 17.56
# re: [Daily Issue] @@IDENTITY, SCOPE_IDENTITY e ... IDENT_CURRENT
Gravatar Beh, basta usarlo con criterio...

sicuramente per i casi mission criticale magari è preferibile utilizzare altre soluzioni (ad esempio una scalare su MAX())...
Left by Defkon1 on 01/07/2008 11.49

Leave Your Comment

Title*
Name*
Email (never displayed)
 (will show your gravatar)
Url
Comment*

Please add 1 and 1 and type the answer here:

Preview Your Comment.