Condividi tramite


@@IDENTITY (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureDatabase SQL in Microsoft Fabric

@@IDENTITY è una funzione di sistema che restituisce l'ultimo valore identità inserito.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

@@IDENTITY  

Tipi restituiti

numeric(38,0)

Osservazioni:

Dopo che una INSERTistruzione , SELECT INTO, o copia in blocco è completata, @@IDENTITY contiene l'ultimo valore identità generato dall'istruzione.

  • Se l'istruzione non ha influenzato nessuna tabella con colonne identità, @@IDENTITY restituisce NULL.
  • Se vengono inserite più righe, generando più valori identità, @@IDENTITY restituisce l'ultimo valore identità generato.
  • Se l'istruzione attiva uno o più trigger che esegueno inserti che generano valori identità, chiamare @@IDENTITY immediatamente dopo l'istruzione restituisce l'ultimo valore identità generato dai trigger.
  • Se un trigger viene attivato dopo un'azione di inserimento su una tabella che ha una colonna identità, e il trigger viene inserito in un'altra tabella che non ha colonna identità, @@IDENTITY restituisce il valore identità del primo inserimento. Il @@IDENTITY valore non torna a un'impostazione precedente se l'istruzione o SELECT INTO la INSERT copia in blocco falliscono, o se la transazione viene annullata.

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. Ad esempio, se una istruzione INSERT fallisce a causa di una IGNORE_DUP_KEY violazione, il valore identitario corrente della tabella viene comunque incrementato.

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

  • @@IDENTITY e SCOPE_IDENTITY restituire l'ultimo valore identità generato in qualsiasi tabella della sessione corrente. Tuttavia, SCOPE_IDENTITY restituisce il valore solo all'interno dell'ambito corrente; @@IDENTITY non è limitato a uno specifico ambito.

  • IDENT_CURRENT non è limitato dall'ambito e dalla sessione; è limitato a una tabella specificata. IDENT_CURRENT restituisce il valore identità generato per una tabella specifica in qualsiasi sessione e in qualsiasi ambito. Per altre informazioni, vedere IDENT_CURRENT (Transact-SQL).

L'ambito della @@IDENTITY funzione è la sessione corrente sul server locale su 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 replicazione può influenzare il @@IDENTITY valore, poiché viene utilizzata all'interno dei trigger di replicazione e delle procedure memorizzate. @@IDENTITY non è un indicatore affidabile dell'identità creata dall'utente più recente se la colonna fa parte di un articolo di replicazione. Puoi usare la SCOPE_IDENTITY() sintassi delle funzioni invece di @@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