Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/11/2005, 17:14
Avatar de Mithrandir
Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 8 meses
Puntos: 25
Además de que tienes probabilidad de problemas de concurrencia: pronosticas el valor 5, entra otra inserción que toma el 5, mientras que el 5 que habías pronosticado se convirtió en 6.

No existe una manera exacta de conocerlo, la menos no directamente.

Una manera alterna, que te dará el resultado esperado es usando una tabla que almacene el más reciente y bloquearlo con cada transaccion para asegurar que se utilizará ese número.

1) inicias transaccion usando READ SERIALIZABLE
2) seleccionas el registro correspondiente (probablemente con un "hint" de bloqueo exclusivo de registro)
3) haces lo que quieras que es por lo que quieres el ID antes de la inserción
4) insertas el registro de la aplicacion usando el ID de la tabla de control +1
5) actualizas tabla de control a ID+1
6) cierras transaccion

De esa manera garantizas siempre saber que registro sigue y además libras el problema de concurrencia... aunque obviamente es un proceso tedioso.

Una manera alternativa es usando SCOPE_IDENTITY(), pero eso te dará la clave después de la inserción (que con transacciones puedes deshacer en caso necesario), pero no se si se ajuste a tus necesidades.

Solo por curiosidad.... ¿Para qué quieres el ID desde antes?
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche