none
Problema Campo Identity SQL Server 2016 RRS feed

  • Pregunta

  • Saludos

    Estoy usando SQL SERVER 2016 con C# webforms.

    lo que sucede es que tengo una tabla en sql server con una columna identity que es Id_Empresa, y la secuencia de la numeración salta Ejemplo: 1, 5, 1026, 1027, 1028, 1124 y así sucesivamente, no se porque razón no continua en secuencia si se supone que es eso lo que hace ese campo identity.

    Podrían decirme alguien porque es esto y si se puede solucionar.

    porque sino are un contador y mandare a grabar en esa columna el numero del contador desde c#, es la única que encuentro por ahora.

    Gracias

    lunes, 13 de mayo de 2019 10:27

Respuestas

  • no se porque razón no continua en secuencia si se supone que es eso lo que hace ese campo identity.

    Mal supuesto. No, el Identity no hace eso. El Identity solo garantiza que los números sean crecientes, pero no garantiza que sean consecutivos (es decir, que no haya huecos en la secuencia).

    Hay varias razones por las que pueden producirse saltos. La más notoria es que alguna operación de inserción falle y se haga un rollback. En ese caso, se pierden todos los valores que habían sido provisionalmente asignados a la transacción no confirmada.

    También se pueden perder bloques más grandes en caso de un reinicio. Creo recordar que había un parche y/o un trace flag que servía para minimizar este problema. Pero esto solo alivia el salto de 1000 unidades que se produce de vez en cuando, no te quita los saltos individuales en caso de rollback.

    Si realmente necesitas una secuencia consecutiva, sin huecos, no podrás usar el Identity. Puedes lograr este comportamiento iniciando transacción, leyendo el MAX, sumando 1, grabando, y confirmando transacción. Sí, esto es más molesto de programar y menos eficiente en tiempo de ejecución, pero sirve para lograr la secuencia sin "huecos".

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 13 de mayo de 2019 16:13
    • Marcado como respuesta agustin173 lunes, 13 de mayo de 2019 21:39
    lunes, 13 de mayo de 2019 12:06

Todas las respuestas

  • no se porque razón no continua en secuencia si se supone que es eso lo que hace ese campo identity.

    Mal supuesto. No, el Identity no hace eso. El Identity solo garantiza que los números sean crecientes, pero no garantiza que sean consecutivos (es decir, que no haya huecos en la secuencia).

    Hay varias razones por las que pueden producirse saltos. La más notoria es que alguna operación de inserción falle y se haga un rollback. En ese caso, se pierden todos los valores que habían sido provisionalmente asignados a la transacción no confirmada.

    También se pueden perder bloques más grandes en caso de un reinicio. Creo recordar que había un parche y/o un trace flag que servía para minimizar este problema. Pero esto solo alivia el salto de 1000 unidades que se produce de vez en cuando, no te quita los saltos individuales en caso de rollback.

    Si realmente necesitas una secuencia consecutiva, sin huecos, no podrás usar el Identity. Puedes lograr este comportamiento iniciando transacción, leyendo el MAX, sumando 1, grabando, y confirmando transacción. Sí, esto es más molesto de programar y menos eficiente en tiempo de ejecución, pero sirve para lograr la secuencia sin "huecos".

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 13 de mayo de 2019 16:13
    • Marcado como respuesta agustin173 lunes, 13 de mayo de 2019 21:39
    lunes, 13 de mayo de 2019 12:06
  • Gracias por tu respuesta
    lunes, 13 de mayo de 2019 21:40