@@IDENTITY (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

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

Convenzioni relative alla sintassi Transact-SQL

Sintassi

@@IDENTITY  

Tipi restituiti

numeric(38,0)

Osservazioni:

Al termine di un'istruzione INSERT, SELECT INTO o bulk copy, @@IDENTITY contiene l'ultimo valore Identity generato dall'istruzione . Se l'istruzione non ha effetto sulle tabelle con colonne Identity, @@IDENTITY restituisce NULL. Se vengono inserite più righe, generando più valori Identity, @@IDENTITY restituisce l'ultimo valore Identity generato. Se l'istruzione genera uno o più trigger che eseguono inserimenti che generano valori Identity, chiamando @@IDENTITY immediatamente dopo che l'istruzione restituisce l'ultimo valore Identity generato dai trigger. Se un trigger viene generato dopo un'azione di inserimento in una tabella con una colonna Identity e il trigger inserisce in un'altra tabella che non dispone di una colonna Identity, @@IDENTITY restituisce il valore Identity del primo inserimento. Il valore @@IDENTITY non ripristina un'impostazione precedente se l'istruzione INSERT o SELECT INTO o la copia bulk ha esito negativo o se 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 tutti l'ultimo valore inserito nella colonna IDENTITY di una tabella.

@@IDENTITY e SCOPE_IDENTITY restituiscono l'ultimo valore Identity generato in qualsiasi tabella della sessione corrente. Tuttavia, SCOPE_IDENTITY restituisce il valore solo all'interno dell'ambito corrente; @@IDENTITY non è limitato 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 altre informazioni, vedere IDENT_CURRENT (Transact-SQL).

L'ambito della funzione @@IDENTITY è la 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 @@IDENTITY, poiché viene usata all'interno dei trigger e delle stored procedure di replica. @@IDENTITY non è un indicatore affidabile dell'identità creata dall'utente più recente se la colonna fa parte di un articolo di replica. È possibile usare la sintassi della funzione SCOPE_IDENTITY() anziché @@IDENTITY. Per altre informazioni, vedere SCOPE_IDENTITY (Transact-SQL)

Nota

La stored procedure chiamante o l'istruzione Transact-SQL deve essere riscritta in modo che usi la funzione SCOPE_IDENTITY(). Verrà così restituito l'ultimo valore Identity usato nell'ambito dell'istruzione utente e non il valore Identity nell'ambito del trigger annidato usato 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 AdventureWorks2022;  
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  

Vedi anche

Funzioni di sistema (Transact-SQL)
CREATE TABLE (Transact-SQL)
IDENT_CURRENT (Transact-SQL)
INSERT (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
SELECT (Transact-SQL)