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.
@@IDENTITY
vous 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 1
peut 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.