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?
Réponses
Trop de publicités?- 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 unselect...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.
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().
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.
"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
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é