¿Cómo se encuentra el número más pequeño no utilizado en una columna de SQL Server?Encuentra el número más pequeño no utilizado en SQL Server
Estoy a punto de importar una gran cantidad de registros grabados manualmente de Excel en una tabla de SQL Server. Todos ellos tienen una identificación numérica (llamada número de documento), pero no fueron asignados secuencialmente por razones que ya no se aplican, lo que significa que a partir de ahora cuando mi sitio web registre un nuevo registro, debe asignarle el número de documento más pequeño posible (mayor que cero) que aún no se ha tomado.
¿Hay alguna manera de hacerlo mediante SQL simple o es un problema para TSQL/código?
Gracias!
EDITAR
agradecimiento especial a WW para plantear la cuestión de la concurrencia. Dado que esta es una aplicación web, tiene múltiples subprocesos por definición y cualquiera que se enfrente a este mismo problema debería considerar bloquear un código o un nivel de DB para evitar un conflicto.
LINQ
FYI - esto se puede lograr a través de LINQ con el siguiente código:
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
Esto perderá cualquier bloque contiguo de identificadores que comience al principio del rango. Por ejemplo, si 'table' tiene identificadores (5,6,8,9,10), esto devolverá 7, no ninguno de 1-4. – joshperry
@joshperry Tienes razón. Me perdí el comentario sobre querer completar todas las identificaciones mayores a cero. Añadí una solución fea. Quizás alguien sugiera una mejora. –
+1 ¡Muy útil, gracias! La mayoría de las otras respuestas aquí han sido "no necesitas hacer eso, deja que el sistema incremente la clave", pero mi caso no es para la clave principal, sino otro campo numérico único donde las ranuras vacías son un problema pero pueden ocurrir, y no como resultado de una eliminación. –