Condividi tramite


SCOPE_IDENTITY (Transact-SQL)

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

Restituisce l'ultimo valore Identity inserito in una colonna Identity nello stesso ambito. Un ambito è un modulo, ovvero una stored procedure, un trigger, una funzione o un batch. Se due istruzioni sono incluse nella stessa stored procedure, nella stessa funzione o nello stesso batch, appartengono allo stesso ambito.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

SCOPE_IDENTITY()  

Tipi restituiti

numeric(38,0)

Osservazioni:

SCOPE_IDENTITY, IDENT_CURRENT e @@IDENTITY sono funzioni simili perché restituiscono valori inseriti nelle colonne Identity.

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 generato per una tabella specifica in qualsiasi sessione e in qualsiasi ambito. Per altre informazioni, vedere IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY e @@IDENTITY restituiscono gli ultimi valori Identity generati in qualsiasi tabella della sessione corrente. Tuttavia, SCOPE_IDENTITY restituisce i valori inseriti solo all'interno dell'ambito corrente; @@IDENTITY non è limitato a un ambito specifico.

Si supponga, ad esempio, che esistano due tabelle, T1 e T2, e che venga definito un trigger INSERT per T1. Quando viene inserita una riga in T1, viene attivato il trigger che inserisce una riga in T2. Questo scenario illustra due ambiti, ovvero l'inserimento in T1 e l'inserimento in T2 da parte del trigger.

Se entrambe le tabelle T1 e T2 contengono colonne Identity, @@IDENTITY e SCOPE_IDENTITY restituiranno valori diversi al termine dell'esecuzione di un'istruzione INSERT su T1. @@IDENTITY restituisce l'ultimo valore inserito in una colonna Identity in qualsiasi ambito durante la sessione corrente, ovvero il valore inserito in T2. SCOPE_IDENTITY() restituisce il valore IDENTITY inserito in T1, che rappresenta l'ultimo inserimento eseguito nello stesso ambito. Se viene chiamata prima che nell'ambito specifico venga eseguita un'istruzione INSERT in una colonna Identity, la funzione SCOPE_IDENTITY() restituisce il valore Null.

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.

Esempi

R. Uso di @@IDENTITY e SCOPE_IDENTITY con trigger

Nell'esempio seguente vengono create due tabelle, TZ e TY, e viene definito un trigger INSERT per TZ. Quando viene inserita una riga nella tabella TZ, viene attivato il trigger (Ztrig) che inserisce una riga in TY.

USE tempdb;  
GO  
CREATE TABLE TZ (  
   Z_id  INT IDENTITY(1,1)PRIMARY KEY,  
   Z_name VARCHAR(20) NOT NULL);  
  
INSERT TZ  
   VALUES ('Lisa'),('Mike'),('Carla');  
  
SELECT * FROM TZ;  

Set di risultati: la tabella TZ ha il seguente aspetto.

Z_id   Z_name  
-------------  
1      Lisa  
2      Mike  
3      Carla  
CREATE TABLE TY (  
   Y_id  INT IDENTITY(100,5)PRIMARY KEY,  
   Y_name VARCHAR(20) NULL);  
  
INSERT TY (Y_name)  
   VALUES ('boathouse'), ('rocks'), ('elevator');  
  
SELECT * FROM TY;  

Set di risultati: la tabella TY ha il seguente aspetto:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

Creare il trigger che inserisce una riga nella tabella TY quando viene inserita una riga nella tabella TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

Attivare (FIRE) il trigger e determinare i valori Identity ottenuti con le funzioni @@IDENTITY e SCOPE_IDENTITY.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Il set di risultati è il seguente.

/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`  
SCOPE_IDENTITY  
4  

/*@@IDENTITY returns the last identity value inserted to TY by the trigger. 
  This fired because of an earlier insert on TZ.*/
@@IDENTITY  
115  

B. Uso di @@IDENTITY e SCOPE_IDENTITY() con la replica

Negli esempi seguenti viene illustrato come utilizzare@@IDENTITY e SCOPE_IDENTITY() per inserimenti in un database pubblicato per la replica di tipo merge. Entrambe le tabelle degli esempi sono incluse nel database di esempio AdventureWorks2022. La tabella Person.ContactType non viene pubblicata, mentre la tabella Sales.Customer viene pubblicata. Con la replica di tipo merge vengono aggiunti trigger alle tabelle pubblicate. @@IDENTITY può pertanto restituire il valore dell'inserimento in una tabella del sistema di replica anziché dell'inserimento in una tabella utente.

Il valore Identity massimo consentito per la tabella Person.ContactType è 20. Se si inserisce una riga nella tabella, @@IDENTITY e SCOPE_IDENTITY() restituiscono lo stesso valore.

USE AdventureWorks2022;  
GO  
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Il set di risultati è il seguente.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Il valore Identity massimo consentito per la tabella Sales.Customer è 29483. Se si inserisce una riga nella tabella, vengono restituiti valori diversi da @@IDENTITY e SCOPE_IDENTITY(). Tramite SCOPE_IDENTITY() viene restituito il valore dell'inserimento nella tabella utente, mentre tramite @@IDENTITY viene restituito il valore dell'inserimento nella tabella del sistema di replica. Utilizzare SCOPE_IDENTITY() per le applicazioni che necessitano dell'accesso al valore Identity inserito.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Il set di risultati è il seguente.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Vedi anche

@@IDENTITY (Transact-SQL)