Come si trova il numero inutilizzato più piccolo in una colonna di SQL Server?Trova il numero inutilizzato più piccolo in SQL Server
Sto per importare un numero elevato di record registrati manualmente da Excel in una tabella di SQL Server. Hanno tutti un ID numerico (chiamato numero del documento), ma non sono stati assegnati in sequenza per ragioni che non si applicano più, ovvero da ora in poi quando il mio sito web registra un nuovo record, è necessario assegnargli il numero di documento più piccolo possibile (maggiore di zero) che non è già stato preso.
C'è un modo per farlo tramite semplice SQL o si tratta di un problema per TSQL/codice?
Grazie!
EDIT
Un ringraziamento speciale a WW per sollevare la questione della concorrenza. Poiché si tratta di un'app Web, è multithreading per definizione e chiunque debba affrontare questo stesso problema deve considerare un codice o un blocco del livello di DB per prevenire un conflitto.
LINQ
CRONACA - questo può essere realizzato tramite LINQ con il seguente codice:
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
Mancherà qualsiasi blocco contiguo di ID che inizia all'inizio dell'intervallo. Ad esempio, se 'table' ha id (5,6,8,9,10) questo restituirà 7, non uno qualsiasi di 1-4. – joshperry
@joshperry Hai ragione. Ho perso il commento sul voler riempire tutti gli id più di zero. Ho aggiunto una brutta soluzione. Forse qualcuno suggerirà un miglioramento. –
+1 Molto utile, grazie! La maggior parte delle altre risposte qui è stata "non è necessario farlo, lasciare che il sistema incrementi la chiave", ma il mio caso non è per la chiave primaria, ma invece un altro campo numerico univoco in cui gli slot vuoti sono un problema ma possono si verificano, e non come risultato di una cancellazione. –