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

- [Silverlight] En attendant Silverlight 2 RTW par Blog Technique d'Audrey PETIT le 10-11-2008, 21:55

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le 10-11-2008, 01:18

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le 10-10-2008, 17:52

- Hello CS par Le Blog de julz le 10-10-2008, 12:26

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52