une histoire de scope...

Il m'arrive souvent de répondre à la question suivante : Quelle est la différence entre @@IDENTITY et SCOPE_IDENTITY() ?? Est-ce la portée (locale à la connexion ou globale) ??
La différence n'est pas un problème de portée au sens environnement de connexion mais plus au niveau cascading.
Je m'explique. Tout d'abord rappelons que ces deux fonctions permettent de renvoyer la valeur de l'identity de la dernière insertion effectuée dans une connexion.

Soit deux table :

      CREATE TABLE [dbo].[T1](
    Id [int] IDENTITY(1,1) NOT NULL,
    name [nchar](10) NULL, 
CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED ([Id] ASC)

Et

CREATE TABLE [dbo].[T2](
    Id [int] IDENTITY(1,1) NOT NULL,
    name [nchar](10) NULL, 
CONSTRAINT [PK_T2] PRIMARY KEY CLUSTERED ([Id] ASC)

On souhaite faire une insertion dans T2 à partir d'un trigger de type AFTER INSERT dans T1. Notre trigger ressemblerait a ça :

CREATE TRIGGER [dbo].[TR_T1] ON [dbo].[T1]
AFTER INSERT 
AS
BEGIN  
    INSERT INTO T2(name) VALUES ('test') 
END

Nous insérons 5 lignes dans T2 directement pour avoir un numéro d'identity différent de celui de T1. A ce moment,

  • T1 contient 0 ligne sa valeur d'IDENTITY est de 1

    • à noter sa valeur est de 1 alors qu'aucune insertion n'a encore été faite.

  • T2 contient 5 lignes sa valeur d'IDENTITY est de 5.

Enfin, on effectue notre insertion dans T1 et on récupère l'identity avec nos deux méthodes : 

INSERT INTO T1(name) VALUES ('test') 
PRINT @@IDENTITY
PRINT SCOPE_IDENTITY()

Et le résultat :

(1 ligne(s) affectée(s)) 
(1 ligne(s) affectée(s))
6
1

Et oui ! le @@IDENTITY renvoie le dernier identity inséré quelque soit le niveau dans lequel cette insertion s'est faite. Le SCOPE_IDENTITY() va toujours faire référence à l'insertion du niveau dans lequel cette fonction est exécutée.
En conclusion, si vous n'êtes pas sûr de l'existence de triggers sous-jacents, préférez SCOPE_IDENTITY pour ne pas avoir de mauvaise surprise....
A noter également la fonction 

SELECT IDENT_CURRENT('nom_table') 

qui renvoie l'identity de la dernière insertion, toute session confondue pour une table nom_table donnée.

A bientôt...

Publié vendredi 4 avril 2008 10:17 par guldan
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: une histoire de scope... @ vendredi 4 avril 2008 11:43

PRINT @@IDENTITY à la place de PRINT @@ROWCOUNT non ? Ou alors je n'ai rien compris à l'article ;p

KooKiz

# re: une histoire de scope... @ vendredi 4 avril 2008 13:42

oui désolé, copier-coller malheureux...C'est en effet le @@IDENTITY dont il est question ici.

guldan


Les 10 derniers blogs postés

- [Perso] Découvertes estivales : Linux (Part I) par Le blog de FremyCompany le il y a 1 heure et 11 minutes

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 15 heures et 48 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 17 heures et 2 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le 07-03-2009, 09:56

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le 07-03-2009, 09:00

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 07-03-2009, 08:45

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53