En dehors de la performance, ils ont tous des significations assez différentes.
SCOPE_IDENTITY()vous donnera la dernière valeur d'identité insérée dans une table directement dans l'étendue actuelle (scope = batch, procédure stockée, etc., mais pas à l'intérieur, par exemple, d'un déclencheur déclenché par l'étendue actuelle).
IDENT_CURRENT()vous donnera la dernière valeur d'identité insérée dans une table spécifique à partir de n'importe quelle portée, par n'importe quel utilisateur.
@@IDENTITYvous donne la dernière valeur d'identité générée par l'instruction INSERT la plus récente pour la connexion en cours, indépendamment de la table ou de la portée. (Remarque: Access utilise cette fonction et présente donc quelques problèmes avec les déclencheurs qui insèrent des valeurs dans des tables avec des colonnes d'identité.)
L'utilisation de MAX()ou TOP 1peut vous donner des résultats totalement erronés si la table comporte une étape d'identité négative ou si des lignes ont été insérées SET IDENTITY_INSERT. Voici un script démontrant toutes ces choses:
CREATE TABLE ReverseIdent (
id int IDENTITY(9000,-1) NOT NULL PRIMARY KEY CLUSTERED,
data char(4)
)
INSERT INTO ReverseIdent (data)
VALUES ('a'), ('b'), ('c')
SELECT * FROM ReverseIdent
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9000
SET IDENTITY_INSERT ReverseIdent ON
INSERT INTO ReverseIdent (id, data)
VALUES (9005, 'd')
SET IDENTITY_INSERT ReverseIdent OFF
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9005
Résumé: restez avec SCOPE_IDENTITY(), IDENT_CURRENT()ou @@IDENTITY, et assurez-vous d’utiliser celui qui vous renvoie ce dont vous avez réellement besoin.