SCOPE_IDENTITY (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Renvoie la dernière valeur d'identité insérée dans une colonne d'identité dans la même étendue. Une étendue est un module : procédure stockée, déclencheur, fonction ou lot. Par conséquent, deux instructions sont dans la même étendue si elles se trouvent dans la même procédure stockée ou fonction, ou dans le même lot.

Conventions de la syntaxe Transact-SQL

Syntaxe

SCOPE_IDENTITY()  

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Types de retour

numeric(38,0)

Remarques

SCOPE_IDENTITY, IDENT_CURRENT et @@IDENTITY sont des fonctions similaires car elles renvoient des valeurs insérées dans des colonnes d'identité.

IDENT_CURRENT n'est pas limitée par l'étendue et par la session ; elle est limitée à une table spécifiée. IDENT_CURRENT renvoie la valeur générée pour une table spécifique dans n'importe quelle session et n'importe quelle étendue. Pour plus d’informations, consultez IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY et @@IDENTITY renvoient les dernières valeurs d'identité générées dans une table de la session active. Toutefois, SCOPE_IDENTITY renvoie les valeurs insérées uniquement dans l'étendue actuelle. @@IDENTITY n'est pas limitée à une étendue spécifique.

Par exemple, deux tables T1 et T2 et un déclencheur INSERT sont définis sur T1. Lorsqu'une ligne est insérée dans T1, le déclencheur est activé et insère une ligne dans T2. Ce scénario met en œuvre deux étendues : l'insertion dans T1 et l'insertion dans T2 par le déclencheur.

Supposons que T1 et T2 comportent les colonnes d'identité, @@IDENTITY et SCOPE_IDENTITY renvoient des valeurs différentes à la fin d'une instruction INSERT sur T1. @@IDENTITY renvoie la dernière valeur de la colonne d’identité insérée dans toutes les étendues au cours de la session en cours. Il s'agit de la valeur insérée dans T2. SCOPE_IDENTITY() renvoie la valeur IDENTITY insérée dans T1. Il s'agit de la dernière insertion qui s'est produite dans la même étendue. La fonction SCOPE_IDENTITY() renvoie la valeur NULL si la fonction est appelée avant qu’une instruction INSERT dans une colonne d’identité soit exécutée dans l’étendue.

Les instructions et les transactions en échec peuvent modifier l'identité actuelle d'une table et créer des trous dans les valeurs des colonnes d'identité. La valeur d'identité n'est jamais annulée, même si la transaction qui a essayé d'insérer la valeur dans la table n'est pas validée. Par exemple, si une instruction INSERT échoue à cause d'une violation d'identité IGNORE_DUP_KEY, la valeur d'identité actuelle de la table augmente quand même d'une unité.

Exemples

R. Utilisation des fonctions @@IDENTITY et SCOPE_IDENTITY avec des déclencheurs

L'exemple suivant crée deux tables, TZ et TY, ainsi qu'un déclencheur INSERT sur TZ. Lorsqu'une ligne est insérée dans la table TZ, le déclencheur (Ztrig) est activé et insère une ligne dans 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;  

Jeu de résultats : Voici à quoi ressemble la table TZ :

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;  

Jeu de résultats : Voici à quoi ressemble TY :

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

Créez le déclencheur qui insère une ligne dans la table TY lorsqu’une ligne est insérée dans la table TZ.

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

FIRE le déclencheur et déterminez quelles valeurs d’identité vous obtenez avec les fonctions @@IDENTITY et SCOPE_IDENTITY.

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

Voici le jeu de résultats obtenu.

/*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. Utilisation des fonctions @@IDENTITY et SCOPE_IDENTITY() avec la réplication

Les exemples suivants indiquent comment utiliser @@IDENTITY et SCOPE_IDENTITY() pour des insertions dans une base de données qui est publiée pour la réplication de fusion. Les deux tables mentionnées à titre d'exemple appartiennent à la base de données exemple AdventureWorks2022 : Person.ContactType n'est pas publiée et Sales.Customer est publiée. La réplication de fusion ajoute des déclencheurs aux tables qui sont publiées. Par conséquent, @@IDENTITY peut retourner la valeur de l'insertion dans une table système de réplication au lieu de l'insertion dans une table utilisateur.

La table Person.ContactType a une valeur d’identité maximale de 20. Si vous insérez une ligne dans la table, @@IDENTITY et SCOPE_IDENTITY() retournent la même valeur.

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  

Voici le jeu de résultats obtenu.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

La table Sales.Customer possède une valeur d'identité maximale de 29483. Si vous insérez une ligne dans la table, @@IDENTITY et SCOPE_IDENTITY() retournent des valeurs différentes. SCOPE_IDENTITY() retourne la valeur de l'insertion dans la table utilisateur, alors que @@IDENTITY retourne la valeur de l'insertion dans la table système de réplication. Utilisez SCOPE_IDENTITY() pour les applications qui doivent accéder à la valeur d'identité insérée.

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

Voici le jeu de résultats obtenu.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Voir aussi

@@IDENTITY (Transact-SQL)