comment savoir la prochaine valeur de la clé primaire de la table sans l'insertion d'enregistrement dans sql server?
Je avoir un les choses dans mon projet où j'ai besoin d'afficher à côté de la clé primaire dans le champ, sans insertion de l'enregistrement physiquement?
Comment puis-je connaître la valeur de la clé primaire sans l'insertion d'enregistrement?
c'est à dire
Permet d'avoir 10 enregistrements avec ID comme clé primaire.
Maintenant, j'ai supprimé les 10 enregistrements, de sorte que la valeur suivante sera 11.
Je veux savoir la valeur de la prochaine clé primaire (11 dans mon cas) sans insertion de l'enregistrement physiquement dans le tableau.
En bref, l'avenir prochain de la valeur de la clé primaire.
Comment puis-je obtenir??
Veuillez fournir la solution.
- j'ai trouvé la solution.
- Voir, il est possible d'obtenir la valeur suivante sans insérer de disque physique.
- c'est PAS une solution valable. Vous pouvez interroger l' ACTUELLE de valeur, mais qui ne fait pas de GARANTIE ce que la valeur suivante sera.....
- Cela semble être un vraiment idiot exigence - le fait de pouvoir afficher quelque chose qui n'est même pas "réel", et pourtant... pourquoi sur terre serait vous (ou votre client) besoin de ça??? Vous aurez besoin d'utiliser la
SEQUENCE
objet dans SQL Server 2012, il n'y a pas fiables, d'autres façon de le faire - mais encore une fois: W-H-Y avez-vous besoin de cette!?!?!?!?!??!? - d'accord avec vous @marc_s, mais après tout, le client a toujours raison :), je lui mais il n'est pas technique, mais je vote la réponse et vos commentaires avec certaines restrictions (pour moi, c'est le travail)
- Voir: Top 5 des Raisons pour lesquelles "Le Client a Toujours raison" est faux
- C'est de la folie. La nécessité de faire indique une énorme faille dans la conception de votre.
Vous devez vous connecter pour publier un commentaire.
MODIFIER (Très important)
Il convient de noter que cette méthode peut être utilisée pour prédire la prochaine id, mais n'a pas gaurentee cette valeur. La raison pour cela est que @marc_s mentionné dans les commentaires, qu'entre le moment où vous avez demandé la valeur, et le temps que vous l'utilisez, une autre transaction pourrait avoir inséré dans ce tableau, selon l'hypothèse de la valeur récupérée nulle et non avenue.
Comme mentionné précédemment, si votre application est basée sur une telle hypothèse, vous avez fait quelques erreurs de conception, et devrait ressembler à retravailler cette solution comme une première priorité.
De IDENT_CURRENT (Transact-SQL)
Ont un coup d'oeil à l'exemple suivant
IDENT_INCR('#Table')
comme ceci:SELECT IDENT_CURRENT('#Table') + IDENT_INCR('#Table')
. Les avertissements habituels s'appliquent: si le système est l'utilisation simultanée, la valeur retournée peut ne pas correspondre à la prochaine ID de produit dans la session.Ce que vous demandez n'a pas vraiment de sens. Les bases de données sont conçus pour supporter de multiples accès de sorte que même si il y avait un moyen pour déterminer la prochaine clé primaire d'identité, sans insertion d'un enregistrement, il y aurait zéro garantir qu'une autre connexion ne serait pas écrire à la table et de revendiquer cette identité avant votre prochaine transaction. Et si vous êtes en train de penser "eh Bien, je pourrais garder un verrou sur elle", alors vous avez essentiellement éliminé toute sorte de plausible situation où le savoir de l'avenir de l'identité de la clé peut vous aider.
Quel est donc votre raisonnement pour vouloir la future identité de la clé?
Avec la version actuelle de SQL Server (2008 R2), et à l'aide de la
IDENTITY
mécanisme, vous NE peut pas savoir la valeur suivante à l'avance. Il est pas bon, garanti moyen de connaître la valeur suivante jusqu'à ce que vous avez inséré la ligne - seulement alors, quand la ligne est stockée à l'intérieur de la table, cette valeur est déterminée et s'en retourna.SQL Server 2012 ("Denali") aura
SEQUENCES
qui est presque le même queIDENTITY
colonnes - mais autonome, et avec des séquences, vous pouvez demander pour la prochaine valeur (et de l'utiliser ensuite)Lire plus à propos de séquences:
sélectionnez IDENT_CURRENT('utilisateurs')
sélectionnez IDENT_CURRENT('nom de la table')
Pas vraiment une bonne idée, mais si vous voulez une garantie de clé primaire ma suggestion serait d'insérer un enregistrement fictif temporairement et obtenir sa clé primaire, puis modifiez l'enregistrement à l'aide de mise à JOUR lorsque l'enregistrement est validé ou SUPPRIMER l'enregistrement si l'utilisateur annule l'insertion. De toute façon, c'est mieux que d'utiliser un imaginaire de la clé.