@@IDENTITY (Transact-SQL)
Funzione di sistema che restituisce l'ultimo valore Identity immesso.
Convenzioni della sintassi Transact-SQL
Sintassi
@@IDENTITY
Tipi restituiti
numeric(38,0)
Osservazioni
Al termine di un'istruzione INSERT, SELECT INTO o di copia bulk, la funzione @@IDENTITY include l'ultimo valore Identity generato dall'istruzione. Se l'istruzione non ha modificato alcuna tabella contenente la colonna Identity, la funzione @@IDENTITY restituisce NULL. Se vengono inserite più righe, con la conseguente generazione di più valori Identity, la funzione @@IDENTITY restituisce l'ultimo valore Identity generato. Se l'istruzione attiva uno o più trigger per l'esecuzione di inserimenti che generano valori Identity, la chiamata della funzione @@IDENTITY subito dopo l'istruzione restituisce l'ultimo valore Identity generato dai trigger. Se un trigger viene attivato dopo un'operazione di inserimento in una tabella che include una colonna Identity e il trigger esegue l'inserimento in un'altra tabella che non include una colonna Identity, la funzione @@IDENTITY restituisce il valore Identity del primo inserimento. Non viene ripristinato un valore precedente della funzione @@IDENTITY se l'istruzione INSERT, SELECT INTO o l'operazione di copia bulk ha esito negativo oppure viene eseguito il rollback della transazione.
Le istruzioni e le transazioni con esito negativo sono in grado di modificare i dati Identity correnti di una tabella e creare gap nei valori della colonna Identity. Non viene mai eseguito il rollback del valore Identity, anche se non si esegue il commit della transazione che ha tentato l'inserimento del valore nella tabella. Se, ad esempio, un'istruzione INSERT ha esito negativo a causa di una violazione di IGNORE_DUP_KEY, il valore Identity corrente per la tabella viene comunque incrementato.
@@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT sono funzioni simili perché restituiscono l'ultimo valore inserito nella colonna Identity di una tabella.
Le funzioni @@IDENTITY e SCOPE_IDENTITY restituiscono l'ultimo valore Identity generato in una tabella durante la sessione corrente. La funzione SCOPE_IDENTITY tuttavia restituisce il valore solo all'interno dell'ambito corrente, mentre la funzione @@IDENTITY non è limitata a un ambito specifico.
Per la funzione IDENT_CURRENT non esiste alcuna restrizione di ambito o di sessione. La funzione è limitata tuttavia a una tabella specifica. La funzione IDENT_CURRENT restituisce il valore Identity generato per una tabella specifica in qualsiasi sessione e in qualsiasi ambito. Per ulteriori informazioni, vedere IDENT_CURRENT (Transact-SQL).
L'ambito della funzione @@IDENTITY è quello della sessione corrente nel server locale in cui viene eseguita. Questa funzione non può essere applicata a server remoti o collegati. Per ottenere un valore Identity in un server diverso, eseguire una stored procedure nel contesto di un server remoto o collegato specifico in modo che recuperi il valore Identity e lo restituisca alla connessione chiamante nel server locale.
La replica può influire sul valore di @@IDENTITY poiché viene utilizzato nelle stored procedure e nei trigger di replica. Se la colonna è inclusa in un articolo di replica, @@IDENTITY non costituisce un indicatore affidabile del più recente valore Identity creato dall'utente. È possibile utilizzare la sintassi della funzione SCOPE_IDENTITY() anziché @@IDENTITY. Per ulteriori informazioni, vedere SCOPE_IDENTITY (Transact-SQL).
[!NOTA]
L'istruzione Transact-SQL o la stored procedure chiamante deve essere riscritta in modo da utilizzare la funzione SCOPE_IDENTITY(). Verrà così restituito l'ultimo valore Identity utilizzato nell'ambito di tale istruzione utente e non il valore Identity nell'ambito del trigger nidificato utilizzato dalla replica.
Esempi
Nell'esempio seguente viene inserita una riga in una tabella contenente una colonna Identity (LocationID) e viene utilizzata la funzione @@IDENTITY per visualizzare il valore Identity nella nuova riga.
USE AdventureWorks2012;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO