Este sigue siendo un problema muy común entre muchos desarrolladores y aplicaciones, independientemente de su tamaño.
Lamentablemente, las sugerencias anteriores no solucionan todos los escenarios, es decir, alojamiento compartido, no puede confiar en su host para establecer el parámetro de inicio -t272.
Además, si tiene tablas existentes que usan estas columnas de identidad para las claves primarias, es un ENORME esfuerzo eliminar esas columnas y recrear otras nuevas para usar la solución alternativa de la secuencia BS. La solución alternativa de secuencia solo es buena si está diseñando tablas nuevas desde cero en SQL 2012+
La conclusión es que, si está en SQL Server 2008R2, MANTÉNGASE EN ELLO. En serio, quédate ahí. Hasta que Microsoft admita que introdujeron un error ENORME, que todavía está allí incluso en Sql Server 2016, no deberíamos actualizarlo hasta que lo posean y lo FIJEN.
Microsoft introdujo un cambio radical, es decir, rompieron una API funcional que ya no funciona según lo diseñado, debido a que su sistema olvida su identidad actual en un reinicio. Caché o no caché, esto es inaceptable, y el desarrollador de Microsoft con el nombre de Bryan necesita ser el propietario, en lugar de decirle al mundo que es "por diseño" y una "característica". Claro, el almacenamiento en caché es una característica, pero perder la noción de cuál debería ser la próxima identidad NO ES UNA CARACTERÍSTICA. Es un error!
Compartiré la solución alternativa que utilicé, porque Mis bases de datos están en servidores de alojamiento compartido, además, no estoy soltando y recreando mis columnas de Clave primaria, eso sería una gran PITA.
En cambio, este es mi truco vergonzoso (pero no tan vergonzoso como este error POS que ha introducido Microsoft).
Hack / Fix:
Antes de los comandos de inserción, simplemente reinicialice su identidad antes de cada inserción. Esta solución solo se recomienda si no tiene control de administrador sobre su instancia de SQL Server, de lo contrario, sugiero volver a reiniciar el servidor.
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
Solo esas 3 líneas inmediatamente antes de su inserción, y debería estar listo para comenzar. Realmente no afectará tanto el rendimiento, es decir, pasará desapercibido.
Buena suerte.
order by ReceiptNo
a su consulta, ¿esos registros realmente no están allí? ¿Está seguro de que cuando se insertan registros no hay errores? Si un registro intenta insertarse y falla, la identidad aumentará, lo mismo si se eliminan los registros. Si se eliminan los registros,ReceiptNo
no se restablece. ¿Puedes publicar la tabla de creación para laFee
tabla?