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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01