@@IDENTITY (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Fonction système qui retourne la dernière valeur d'identité insérée.

Conventions de la syntaxe Transact-SQL

Syntaxe

@@IDENTITY  

Types de retour

numeric(38,0)

Remarques

À la fin d'une instruction INSERT, SELECT INTO ou d'une copie par bloc, @@IDENTITY contient la dernière valeur d'identité générée par l'instruction. Si l'instruction n'a affecté aucune table contenant des colonnes d'identité, @@IDENTITY retourne la valeur NULL. Si plusieurs lignes ont été insérées, générant ainsi plusieurs valeurs d'identité, @@IDENTITY retourne la dernière valeur d'identité générée. Si l'instruction active un ou plusieurs déclencheurs chargés d'effectuer des instructions INSERT qui génèrent des valeurs d'identité, l'appel de @@IDENTITY immédiatement après l'instruction retourne la dernière valeur d'identité générée par les déclencheurs. Si un déclencheur est activé après une action d'insertion sur une table dotée d'une colonne d'identité et qu'il effectue une opération d'insertion dans une autre table dépourvue d'une colonne d'identité, @@IDENTITY retourne la valeur d'identité de la première insertion. La variable @@IDENTITY ne revient pas à une valeur précédente en cas d'échec de l'instruction INSERT ou SELECT INTO, d'échec d'une copie par bloc ou d'une restauration de la transaction.

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é.

@@IDENTITY, SCOPE_IDENTITY et IDENT_CURRENT sont des fonctions similaires car elles retournent toutes la dernière valeur insérée dans la colonne IDENTITY d'une table.

@@IDENTITY et SCOPE_IDENTITY retournent la dernière valeur d'identité générée dans une table au cours de la session en cours. Toutefois, SCOPE_IDENTITY retourne uniquement la valeur à l'intérieur de la portée actuelle ; @@IDENTITY n'est pas limitée à une portée spécifique.

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 retourne la valeur d'identité générée pour une table spécifique dans n'importe quelle session et dans n'importe quelle portée. Pour plus d’informations, consultez IDENT_CURRENT (Transact-SQL).

L'étendue de la fonction @@IDENTITY correspond à la session en cours sur le serveur local où elle est exécutée. Cette fonction est inapplicable aux serveurs distants ou liés. Pour obtenir une valeur d'identité sur un autre serveur, exécutez une procédure stockée sur ce serveur distant ou lié puis faites en sorte que celle-ci, en cours d'exécution dans le contexte du serveur distant ou lié, collecte la valeur d'identité et la retourne à la connexion appelante sur le serveur local.

La réplication peut affecter la valeur @@IDENTITY car elle est utilisée dans les déclencheurs de réplication et les procédures stockées. @@IDENTITY n'est pas un indicateur fiable de l'identité créée par l'utilisateur la plus récente si la colonne fait partie d'un article de réplication. Vous pouvez utiliser la syntaxe de la fonction SCOPE_IDENTITY() au lieu de @@IDENTITY. Pour plus d’informations, consultez SCOPE_IDENTITY (Transact-SQL)

Notes

La procédure stockée ou l’instruction Transact-SQL appelante doit être réécrite pour utiliser la fonction SCOPE_IDENTITY() qui retourne l’identité la plus récente utilisée dans l’étendue de cette instruction utilisateur, et non l’identité dans l’étendue du déclencheur imbriqué utilisée par la réplication.

Exemples

L'exemple suivant insère une ligne dans une table dotée d'une colonne d'identité (LocationID) et utilise @@IDENTITY pour afficher la valeur d'identité utilisée dans la nouvelle ligne.

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  

Voir aussi

Fonctions système (Transact-SQL)
CREATE TABLE (Transact-SQL)
IDENT_CURRENT (Transact-SQL)
INSERT (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
SELECT (Transact-SQL)