Je sais que Scope_Identity()
, Identity()
, @@Identity
et Ident_Current()
tous obtenir la valeur de la colonne d'identité, mais j'aimerais connaître la différence.
Une partie de la controverse que j'ai est que signifient-ils par la portée appliquée à ces fonctions ci-dessus?
J'aimerais aussi un exemple simple de différents scénarios d'utilisation?
sql
sql-server
identity
Tebo
la source
la source
Réponses:
@@identity
fonction renvoie la dernière identité créée dans la même session.scope_identity()
fonction renvoie la dernière identité créée dans la même session et la même portée.ident_current(name)
renvoie la dernière identité créée pour une table ou vue spécifique dans une session.identity()
fonction n'est pas utilisée pour obtenir une identité, elle sert à créer une identité dans uneselect...into
requête.La session est la connexion à la base de données. L'étendue est la requête actuelle ou la procédure stockée actuelle.
Une situation où les fonctions
scope_identity()
et les@@identity
fonctions diffèrent, est si vous avez un déclencheur sur la table. Si vous avez une requête qui insère un enregistrement, amenant le déclencheur à insérer un autre enregistrement quelque part, lascope_identity()
fonction renverra l'identité créée par la requête, tandis que la@@identity
fonction renverra l'identité créée par le déclencheur.Donc, normalement, vous utiliseriez la
scope_identity()
fonction.la source
Bonne question.
@@IDENTITY
: renvoie la dernière valeur d'identité générée sur votre connexion SQL (SPID). La plupart du temps, ce sera ce que vous voulez, mais parfois ce n'est pas le cas (comme lorsqu'un déclencheur est déclenché en réponse à unINSERT
, et que le déclencheur exécute une autreINSERT
instruction).SCOPE_IDENTITY()
: renvoie la dernière valeur d'identité générée dans la portée actuelle (c.-à-d. procédure stockée, déclencheur, fonction, etc.).IDENT_CURRENT()
: renvoie la dernière valeur d'identité pour une table spécifique. Ne l'utilisez pas pour obtenir la valeur d'identité d'unINSERT
, elle est soumise à des conditions de concurrence (c'est-à-dire plusieurs connexions insérant des lignes sur la même table).IDENTITY()
: utilisé lors de la déclaration d'une colonne dans une table comme colonne d'identité.Pour plus d'informations, voir: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Pour résumer: si vous insérez des lignes et que vous souhaitez connaître la valeur de la colonne d'identité pour la ligne que vous venez d'insérer, utilisez toujours
SCOPE_IDENTITY()
.la source
Si vous comprenez la différence entre la portée et la session, il sera très facile de comprendre ces méthodes.
Un très bel article de blog d'Adam Anderson décrit cette différence:
Ainsi, les différences entre les trois méthodes de recherche d'identité sont les suivantes:
la source
Scope désigne le contexte de code qui exécute l'
INSERT
instructionSCOPE_IDENTITY()
, par opposition à la portée globale de@@IDENTITY
.Donne des résultats différents.
la source
Pour clarifier le problème avec
@@Identity
:Par exemple, si vous insérez une table et que cette table a des déclencheurs faisant des insertions,
@@Identity
retournera l'id de l'insertion dans le déclencheur (alog_id
ou quelque chose), tandis quescope_identity()
retournera l'id de l'insertion dans la table d'origine.Donc, si vous n'avez aucun déclencheur,
scope_identity()
et@@identity
que vous retournerez la même valeur. Si vous avez des déclencheurs, vous devez réfléchir à la valeur que vous souhaitez.la source
Scope Identity
: Identité du dernier enregistrement ajouté dans la procédure stockée en cours d'exécution.@@Identity
: Identité du dernier enregistrement ajouté dans le lot de requêtes, ou à la suite de la requête, par exemple une procédure qui effectue une insertion, puis déclenche un déclencheur qui insère ensuite un enregistrement retournera l'identité de l'enregistrement inséré à partir du déclencheur.IdentCurrent
: La dernière identité allouée pour la table.la source
Voici une autre bonne explication du livre :
la source