Comment obtenir l’identité d’une ligne insérée ?
@@IDENTITY renvoie la dernière valeur d’identité générée pour n’importe quelle table dans la session courante, à travers toutes les portées. Vous devez être prudent ici, car c’est à travers toutes les portées. Vous pourriez obtenir une valeur provenant d’un déclencheur, plutôt que de votre instruction courante.
SCOPE_IDENTITY() renvoie la dernière valeur d’identité générée pour n’importe quelle table dans la session courante et la portée courante. C’est généralement ce que vous voulez utiliser.
IDENT_CURRENT('tableName') renvoie la dernière valeur d’identité générée pour une table spécifique dans n’importe quelle session et n’importe quelle portée. Cela vous permet de spécifier de quelle table vous voulez la valeur, au cas où les deux précédentes ne correspondent pas exactement à vos besoins (très rare). De plus, comme l’a mentionné @Guy Starbuck, « Vous pourriez utiliser ceci si vous voulez obtenir la valeur IDENTITY courante pour une table dans laquelle vous n’avez pas inséré d’enregistrement. »
La clause OUTPUT de l’instruction INSERT vous permet d’accéder à chaque ligne qui a été insérée via cette instruction. Puisqu’elle est limitée à l’instruction spécifique, elle est plus directe que les autres fonctions ci-dessus. Cependant, elle est un peu plus verbeuse (vous devrez insérer dans une variable de table/table temporaire puis interroger celle-ci) et elle donne des résultats même dans un scénario d’erreur où l’instruction est annulée. Cela dit, si votre requête utilise un plan d’exécution parallèle, c’est la seule méthode garantie pour obtenir l’identité (à moins de désactiver le parallélisme). Cependant, elle est exécutée avant les déclencheurs et ne peut pas être utilisée pour renvoyer des valeurs générées par des déclencheurs.