Partager via


@@IDENTITY (Transact-SQL)

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

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

@@IDENTITY

Types de retour

numeric(38,0)

Notes

À 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 qui ont échoué peuvent modifier l'identité actuelle pour une table et créer des écarts dans les valeurs de colonne d'identité. La valeur d'identité n'est jamais restaurée même si la transaction qui a essayé d'insérer la valeur dans la table n'est pas validée. Par exemple, même si une instruction INSERT échoue en raison d'une violation IGNORE_DUP_KEY, la valeur d'identité actuelle pour la table est incrémentée.

@@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 au niveau de l'étendue et de la session, car elle est restreinte à 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)

[!REMARQUE]

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

Exemple

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 AdventureWorks;
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