J'essaie de récupérer la valeur-clé après une instruction INSERT. Exemple: j'ai une table avec le nom et l'identifiant des attributs. id est une valeur générée.
INSERT INTO table (name) VALUES('bob');
Maintenant, je veux récupérer l'identifiant dans la même étape. Comment cela se fait-il?
Nous utilisons Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbic
la source
la source
Réponses:
Pas besoin d'un SELECT séparé ...
Cela fonctionne également pour les colonnes non IDENTITY (telles que les GUID)
la source
Utilisez
SCOPE_IDENTITY()
pour obtenir la nouvelle valeur d'IDhttp://msdn.microsoft.com/en-us/library/ms190315.aspx
la source
id
c'est l'identitéid
, alors oui.Est le pari le plus sûr car il existe un problème connu avec le conflit de clause OUTPUT sur les tables avec déclencheurs. Rend cela assez peu fiable car même si votre table n'a actuellement aucun déclencheur - quelqu'un qui en ajoute un en bas de la ligne cassera votre application. Comportement de type bombe à retardement.
Voir l'article msdn pour une explication plus approfondie:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
la source
Entity Framework effectue quelque chose de similaire à la réponse de gbn:
Les résultats de sortie sont stockés dans une variable de table temporaire, puis sélectionnés à nouveau sur le client. Faut être conscient du gotcha:
Je n'ai aucune idée pourquoi EF rejoindrait intérieurement la table éphémère à la vraie table (dans quelles circonstances les deux ne correspondraient-elles pas).
Mais c'est ce que fait EF.
SQL Server 2008 ou plus récent uniquement. Si c'est 2005, alors vous n'avez pas de chance.
la source
Customer
enregistrement inséré , car il peut y avoir d'autres logiques côté DB qui l'affectent, par exempleDEFAULT
sur certaines colonnes, déclencheurs sur la table, etc. EF met à jour le l'entité (objet) qu'il a utilisée pour l'insertion, de sorte que le côté client obtient l'objet client avec l'ID et tout le reste représentant l'état actuel de la ligne.@@IDENTITY
Est une fonction système qui renvoie la dernière valeur d'identité insérée.la source
Il existe de nombreuses façons de quitter après l'insertion
IDENT_CURRENT : il renvoie la dernière identité créée pour une table ou une vue particulière dans une session.
SCOPE_IDENTITY : il renvoie la dernière identité d'une même session et la même étendue. Une étendue est une procédure stockée / déclencheur, etc.
@@ IDENTITY : Il renvoie la dernière identité de la même session.
la source
out put
pourbulk insert
et par insertionselect statement
. merci votre suggestionLa solution la meilleure et la plus sûre utilise
SCOPE_IDENTITY()
.Il vous suffit d'obtenir l'identité de la portée après chaque insertion et de l'enregistrer dans une variable car vous pouvez appeler deux insertions dans la même portée.
ident_current
et@@identity
peut-être qu'ils fonctionnent, mais ils ne sont pas une portée sûre. Vous pouvez avoir des problèmes dans une grande applicationPlus de détails sont ici Microsoft docs
la source
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
clause est une solution meilleure et plus pure :)Vous pouvez utiliser
scope_identity()
pour sélectionner l'ID de la ligne que vous venez d'insérer dans une variable, puis sélectionnez simplement les colonnes que vous souhaitez dans cette table où l'id = l'identité que vous avez obtenuescope_identity()
Voir ici pour les informations MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
la source
Il existe plusieurs façons d'obtenir le dernier ID inséré après la commande d'insertion.
@@IDENTITY
: Il renvoie la dernière valeur d'identité générée sur une connexion dans la session en cours, indépendamment de la table et de la portée de l'instruction qui a produit la valeurSCOPE_IDENTITY()
: Il renvoie la dernière valeur d'identité générée par l'instruction insert dans la portée actuelle de la connexion actuelle, quelle que soit la table.IDENT_CURRENT(‘TABLENAME’)
: Il renvoie la dernière valeur d'identité générée sur la table spécifiée, indépendamment de toute connexion, session ou étendue. IDENT_CURRENT n'est pas limité par la portée et la session; il est limité à une table spécifiée.Maintenant, il semble plus difficile de décider lequel correspondra exactement à mes besoins.
Je préfère principalement SCOPE_IDENTITY ().
Si vous utilisez select SCOPE_IDENTITY () avec TableName dans l'instruction d'insertion, vous obtiendrez le résultat exact selon vos attentes.
Source: CodoBee
la source
Voici comment j'utilise OUTPUT INSERTED, lors de l'insertion dans une table qui utilise l'ID comme colonne d'identité dans SQL Server:
la source
Vous pouvez ajouter une instruction select à votre instruction insert. Integer myInt = Insérer dans la table1 (FName) les valeurs ('Fred'); Sélectionnez Scope_Identity (); Cela renverra une valeur de l'identité lors de l'exécution du scaler.
la source
Après avoir effectué une insertion dans une table avec une colonne d'identité, vous pouvez référencer @@ IDENTITY pour obtenir la valeur: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
la source
* L'ordre des paramètres dans la chaîne de connexion est parfois important. * L'emplacement du paramètre Provider peut casser le curseur du jeu d'enregistrements après l'ajout d'une ligne. Nous avons vu ce comportement avec le fournisseur SQLOLEDB.
Après l'ajout d'une ligne, les champs de ligne ne sont pas disponibles, À MOINS QUE le fournisseur ne soit spécifié comme premier paramètre dans la chaîne de connexion. Lorsque le fournisseur se trouve n'importe où dans la chaîne de connexion, sauf en tant que premier paramètre, les nouveaux champs de ligne insérés ne sont pas disponibles. Lorsque nous avons déplacé le fournisseur vers le premier paramètre, les champs de ligne sont apparus comme par magie.
la source