2008-11-19 8 views
4

je recevais déjà la prochaine autonumber disponible utilisé dans Access en faisant une requête simple comme ceci:Comment obtenir le prochain numéro d'identité utilisé dans SQL 2005 et ASP?

SELECT RecordNumber, Info FROM myTABLE WHERE 0=1 

De cette façon, je pourrais créer une variable pour tenir le currentRecord et il utilisera le même autonumber que l'accès allait à utiliser quand je mettais la ligne

Exemple

rs.AddNew 
currentRecord = rs("RecordNumber") 

rsInfo = "SomeFormData" & currentRecord 
rs.Update 
rs.Close 

maintenant cette utilisation pour travailler sur MS Access, mais dans SQL 2005, je ne reçois pas de retour l'identité créée par le nouveau record. "SomeFormData" a été inséré correctement, le champ RecordNumber dans SQL a été rempli par le nouveau numéro automatique, mais je n'ai pas le RecordNumber dans mes variables et j'en ai besoin pour continuer à remplir des formulaires connexes, enregistrer des données dans des tables connexes et pour enregistrer le numéro currentRecord.

Question est, est-il un moyen de récupérer ce numéro unique lors d'un nouvel insert?

Répondre

9

IDENT_CURRENT('tableName') (comprennent les guillemets simples) renvoie la valeur actuelle de l'identité pour la table donnée. Cette valeur doit être la dernière valeur d'identité affectée utilisée dans la table. En d'autres termes, vous aurez déjà une ligne avec cette valeur d'identité dans la table, sauf si cette ligne a été supprimée. La valeur d'identité qui sera attribuée au prochain INSERT sera IDENT_CURRENT('tableName') + IDENT_INCR('tableName').

Je ne recommande cependant pas cela. Si vous pré-déterminez la valeur d'identité suivante de cette façon, vous risquez de vous retrouver dans une situation où un autre processus fait que l'insertion qui obtient réellement cet ID avant le vôtre, finit par utiliser la mauvaise valeur d'ID.

Il est préférable de faire d'abord votre insertion (même si vous n'avez pas encore toutes les données), et utilisez SCOPE_IDENTITY() pour obtenir l'ID réel assigné.

Vous pourriez vous demander pourquoi SCOPE_IDENTITY() est meilleur que IDENT_CURRENT('tableName'). Comme son nom l'indique, le premier vous donnera la valeur d'identité la plus récente assignée dans votre portée actuelle (votre lot, votre proc stocké, peu importe), alors que ce dernier vous donnera l'identité la plus récente assignée sur la table, par n'importe qui. Même si vous pouvez appeler IDENT_CURRENT juste après 'INSERT, il est toujours possible que quelqu'un d'autre INSERT se produit entre les deux, et IDENT_CURRENT vous donnera la valeur d'identité résultant de leur insert au lieu du vôtre, alors que SCOPE_IDENTITY vous donnera toujours la vôtre.

EDIT:

Il est également intéressant de mentionner que SCOPE_IDENTITY() est favorisée par rapport à la @@IDENTITY qui fonctionne de façon similaire. Bien que les deux retournent la dernière valeur d'identité affectée dans le lot en cours, @@IDENTITY est affecté par les insertions qui se produisent dans les déclencheurs; SCOPE_IDENTITY() ne l'est pas.

+0

Merci cela m'a pointé dans la bonne direction .... – jesusOmar

+0

C'était exactement la question et la réponse dont j'avais besoin. Merci! – JoeCool

1

SELECT CAST (SCOPE_IDENTITY() AS INT)

Questions connexes