153 votes

Quelle est la différence entre Scope_Identity (), Identity (), @@ Identity et Ident_Current?

Je sais que Scope_Identity (), Identity (), @@ Identity et Ident_Current obtiennent tous la valeur de la colonne identité, mais j'aimerais connaître la différence.

Une partie de la controverse que j'ai est de savoir ce qu'ils entendent par portée appliqué à ces fonctions ci-dessus.

J'aimerais aussi un exemple simple de différents scénarios d'utilisation?

316voto

Guffa Points 308133
  • L' @@identity fonction renvoie la dernière de l'identité a créé dans la même session.
  • L' scope_identity() fonction renvoie la dernière de l'identité a créé dans la même séance et le même champ d'application.
  • L' ident_current(name) renvoie le dernier identité créée pour une table ou une vue spécifique dans n'importe quelle session.
  • L' identity() fonction n'est pas utilisée pour obtenir une identité, il est utilisé pour créer une identité dans un select...into de la requête.

La session est la connexion de base de données. La portée est la requête ou la procédure stockée.

Une situation où l' scope_identity() et de la @@identity fonctions diffèrent, c'est que si vous avez un trigger sur la table. Si vous avez une requête qui insère un enregistrement, à l'origine du déclenchement d'insérer un autre disque quelque part, l' scope_identity() fonction sera de retour l'identité créée par la requête, tandis que l' @@identity fonction sera de retour l'identité créée par le déclencheur.

Donc, normalement, vous utilisez l' scope_identity() fonction.

40voto

Brannon Points 12633

Bonne question.

  • @@IDENTITY: retourne la dernière valeur d'identité générés à votre de connexion SQL (SPID). La plupart du temps, il sera ce que vous voulez, mais parfois il ne l'est pas (comme quand un déclencheur est activé en réponse à une instruction INSERT, et le déclencheur exécute une instruction INSERT).

  • SCOPE_IDENTITY(): retourne la dernière valeur d'identité générée dans le champ d'application actuel (c'est à dire une procédure stockée, de déclenchement, de fonction, etc).

  • IDENT_CURRENT(): retourne la dernière valeur d'identité pour une table spécifique. Ne pas l'utiliser pour obtenir la valeur d'identité à partir d'une INSERTION, il est soumis à des conditions de course (c'est à dire les connexions multiples, l'insertion de lignes sur la même table).

  • IDENTITY(): utilisé lors de la déclaration d'une colonne dans un tableau d'une colonne d'identité.

Pour plus d'information, voir: http://msdn.microsoft.com/en-us/library/ms187342.aspx.

Pour résumer: si vous insérez des lignes, et vous voulez savoir la valeur de la colonne identité de la ligne que vous venez d'insérer, toujours utiliser SCOPE_IDENTITY().

14voto

HKS Points 51

Si vous comprenez la différence entre la Portée et de la Session , alors il sera très facile de comprendre les concepts derrière eux.

Très bel article mentionnant différence dans la session et Portée par Adam Anderson à http://blog.falafel.com/Blogs/AdamAnderson/08-04-23/T-SQL_The_difference_between_identity_scope_identity_and_ident_current.aspx

Séance signifie que la connexion actuelle qui est de l'exécution de la commande.

Champ d'application signifie que le contexte immédiat d'une commande. Chaque appel de procédure stockée s'exécute dans son propre champ d'application, et les appels imbriqués exécuter dans une étude de portée dans la procédure d'appel. De même, une commande SQL exécutée à partir d'une application ou d'un SSM s'exécute dans son propre champ d'application, et si qui commande les feux de tous les déclencheurs, chaque déclencheur s'exécute dans son propre imbriquée portée.

Maintenant que ces deux concepts sont définis, voici les différences entre les trois identité méthodes de récupération:

@@identity retourne la dernière valeur d'identité générée dans cette session , mais toute la portée.

scope_identity() renvoie la dernière valeur d'identité générée dans cette session et ce champ d'application.

ident_current() renvoie la dernière valeur d'identité générée pour une table particulière dans toute session et toute la portée.

12voto

devio Points 22981

"Portée" désigne le contexte de code qui exécute l'instruction INSERT (SCOPE_IDENTITY ()), par opposition à la portée globale de @@ IDENTITY.

 CREATE TABLE Foo(
  ID INT IDENTITY(1,1),
  Dummy VARCHAR(100)
)

CREATE TABLE FooLog(
  ID INT IDENTITY(2,2),
  LogText VARCHAR(100)
)

CREATE TRIGGER InsertFoo ON Foo AFTER INSERT AS
BEGIN
  INSERT INTO FooLog (LogText) VALUES ('inserted Foo')
  INSERT INTO FooLog (LogText) SELECT Dummy FROM inserted
END

INSERT INTO Log (Dummy) VALUES ('x')
SELECT SCOPE_IDENTITY(), @@IDENTITY
 

donne des résultats différents

7voto

Sebastian Meine Points 6379

En raison du bogue mentionné par @David Freitas et de l'incompatibilité de la nouvelle fonctionnalité de séquence introduite en 2012, je recommanderais de rester à l'écart de ces trois éléments. À la place, vous pouvez utiliser la clause OUTPUT pour obtenir la valeur d'identité insérée. Un autre avantage est que OUTPUT fonctionne même si vous avez inséré plus d'une ligne.

Pour plus de détails et des exemples, voir ici: Crise d'identité

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: