Condividi tramite


@@IDENTITY (Transact-SQL)

Funzione di sistema che restituisce l'ultimo valore Identity immesso.

Icona di collegamento a un argomentoConvenzioni 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 è stato eseguito il commit della transazione che ha cercato di inserire il 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 AdventureWorks;
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