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