Comment trouvez-vous le plus petit numéro inutilisé dans une colonne SQL Server?Trouvez le plus petit numéro inutilisé dans SQL Server
Je suis sur le point d'importer un grand nombre d'enregistrements enregistrés manuellement à partir d'Excel dans une table SQL Server. Ils ont tous un numéro numérique (appelé numéro de document), mais ils n'ont pas été attribués séquentiellement pour des raisons qui ne s'appliquent plus, ce qui signifie que mon site web enregistre un nouvel enregistrement, il doit lui assigner le plus petit numéro de document possible (supérieur à zéro) qui n'a pas déjà été pris.
Existe-t-il un moyen de le faire par le langage SQL ou est-ce un problème pour TSQL/code?
Merci!
EDIT
grâce à WW pour soulever la question de la concurrence spéciales. Étant donné qu'il s'agit d'une application Web, elle est multi-threadée par définition et toute personne confrontée à ce même problème doit envisager un code ou un verrou de niveau DB pour éviter un conflit.
LINQ
Pour votre information - cela peut être accompli par LINQ avec le code suivant:
var nums = new [] { 1,2,3,4,6,7,9,10};
int nextNewNum = (
from n in nums
where !nums.Select(nu => nu).Contains(n + 1)
orderby n
select n + 1
).First();
nextNewNum == 5
Cela manquera tout bloc contigu d'identifiants commençant au début de la plage. Par exemple, si 'table' a des identifiants (5,6,8,9,10) cela retournera 7, pas n'importe lequel de 1-4. – joshperry
@joshperry Vous avez raison. J'ai manqué le commentaire à propos de vouloir remplir tous les id plus grand que zéro. J'ai ajouté une solution laide. Peut-être que quelqu'un va suggérer une amélioration. –
+1 Très utile, merci! La plupart des autres réponses ici ont été «vous n'avez pas besoin de faire cela, laissez le système incrémenter la clé», mais mon cas n'est pas pour la clé primaire mais plutôt un autre champ numérique unique où les emplacements vides sont un problème mais peuvent se produire, et non à la suite d'une suppression. –