Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

¿Existe el comando que devuelva el próximo autonumérico de una tabla?

Estas en el tema de ¿Existe el comando que devuelva el próximo autonumérico de una tabla? en el foro de SQL Server en Foros del Web. Hola buenas noches, Me imagino que será la pregunta del millón, tengo una tabla, "tclientes", el cual tiene un campo llamado "id" que es autonumérico ...
  #1 (permalink)  
Antiguo 03/11/2005, 20:26
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
¿Existe el comando que devuelva el próximo autonumérico de una tabla?

Hola buenas noches,

Me imagino que será la pregunta del millón, tengo una tabla, "tclientes", el cual tiene un campo llamado "id" que es autonumérico y se incrementa de uno en uno. Es decir, lo de siempre.

¿Saben si hay algún comando en SQL Server que me devuelva el próximo Autonumérico que se vaya a introducir en X campo de X tabla?

En fin, si existe, les agradecería que me lo pusieran.

Muchas gracias por todo lo que da este foro y su gente,

Saludos Cordiales a Todos.
__________________
Charlie.
  #2 (permalink)  
Antiguo 03/11/2005, 22:05
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 22 años
Puntos: 7
Creo que no lo hay. Pero podrias hacer un select max() al campo y sumarle uno
__________________
No tengo firma ahora... :(
  #3 (permalink)  
Antiguo 04/11/2005, 04:26
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Que va Mickel, por que si elimino el ID con valor 4, el siguiente autonúmerico no va a ser otra vez 4, ¿Entiendes?

En fin, si alguien sabe como podría hacerlo, le estaría muy agradecido. Saludos.
__________________
Charlie.
  #4 (permalink)  
Antiguo 04/11/2005, 17:14
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
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
  #5 (permalink)  
Antiguo 05/11/2005, 06:04
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Tengo hecha una aplicación en VB.NET. El usuario puede insertar un registro en un DataTable y pulsar guardar.

Entonces, se mandan los datos almacenados en el DataTable a un SP para que sean insertados en la BD. Este SP, recibe como parametros, el nombre, apellidos, etc.

Pero al almacenar el registro en el DataTable para enviar en la BD, me gustaría previamente recibir el ID, ya que se inserta en el DataTable, se actualiza un Grid con el dato insertado, y podría seleccionarlo para modificar.

Para modificar si que necesito el ID autonúmerico, para enviar a otro SP. Espero haberme explicado y que entiendas por que lo necesito.

Por cierto, ¿No podría conseguir el ID autonúmerico recogiendolo de alguna tabla del Sistema?

Bueno, gracias por tu ayuda y saludos cordiales.
__________________
Charlie.
  #6 (permalink)  
Antiguo 06/11/2005, 12:49
 
Fecha de Ingreso: enero-2004
Mensajes: 310
Antigüedad: 20 años, 3 meses
Puntos: 0
Yo lo que haría es enviarle a un sp los datos, recibir el ID insertado y actualizar el datatable.
__________________
Un saludo,
Trucos
Videos
  #7 (permalink)  
Antiguo 07/11/2005, 17:27
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
El automunérico tiene la ventaja de que precisamente te olvidas de todo ese procedimiento para obtener el siguiente valor. La desventaja es que no puedes conocer el valor que será asignado.

En general diría que no intentes obtener el ID desde antes, complicará tu diseño innecesariamente.

El último id lo obtienes con @@identity o SCOPE_IDENTITY(), pero eso queda limitado a valores dentro de la transacción, no como lo que quieres hacer.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 17/08/2008, 23:48
 
Fecha de Ingreso: febrero-2008
Mensajes: 18
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: ¿Existe el comando que devuelva el próximo autonumérico de una tabla?

Ya lo publique en otro tema, pero es que me vino al pelo y espero que les sirva:
http://enphp.com.ar/?p=13
  #9 (permalink)  
Antiguo 18/08/2008, 10:04
Avatar de rj69  
Fecha de Ingreso: agosto-2008
Ubicación: Melipilla
Mensajes: 49
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: ¿Existe el comando que devuelva el próximo autonumérico de una tabla?

estimado chcma

la verdad es que deberias cambiar un concepto en el tratamiento de tu base de datos, si tienes registro que fueron ingresados por un ID_clientes, y posteriormente puedes eliminar este cliente, tendras informacion inconsistente en la DB
creo que lo mejor seria agregarle un campo a tu tabla cliente, que te sirva como un FLAG, (0 y 1), con el cual indiquies si el usuario esta activo o no, con esto nunca eliminas al usuario, y si quieres saber cuales son tus actuales usuarios, selecionas a todos los que tengan el flag en 1(encendido), y obviamente los que esten en 0 es que ya no existen, pero a los usuarios nunca los elimines, asi siempre podras incrementar un nuevo usuario en (select count(*) from usuario)+1.

creo que esto es mas aconsejable que tratar de llevar la cuenta por otro lado.

atte.
RJ69
  #10 (permalink)  
Antiguo 28/08/2008, 16:22
 
Fecha de Ingreso: agosto-2008
Mensajes: 1
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: ¿Existe el comando que devuelva el próximo autonumérico de una tabla?

No sean mala onda con el compadre. Contestele bien. Prueba con la función IDENT_CURRENT.

Saludos!!!
  #11 (permalink)  
Antiguo 16/12/2009, 13:10
 
Fecha de Ingreso: octubre-2006
Mensajes: 15
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: ¿Existe el comando que devuelva el próximo autonumérico de una tabla?

Cita:
Iniciado por rj69 Ver Mensaje

creo que lo mejor seria agregarle un campo a tu tabla cliente, que te sirva como un FLAG, (0 y 1), con el cual indiquies si el usuario esta activo o no, con esto nunca eliminas al usuario, y si quieres saber cuales son tus actuales usuarios, selecionas a todos los que tengan el flag en 1(encendido), y obviamente los que esten en 0 es que ya no existen, pero a los usuarios nunca los elimines, asi siempre podras incrementar un nuevo usuario en (select count(*) from usuario)+1.
Coincido contigo rj69. Yo creo en todas las tablas dos campos a mayores, que son Activo (el que tu llamas FLAG) y Fecha_Activo. De esta forma en vez de eliminar desactivo la fila, y así los datos siguen estando para consultas en el Historico. Respecto al ID, mi consejo hacer busquedas, eliminaciones e inserciones en el datatable por el valor del campo ID y no por el numero de fila del datatable. Porque aun en el caso de no eliminar ninguna fila en la base de datos, si trabajas en entorno multiusuario otro usuario puede agregar una fila y ya tendrías problemas.
El campo Fecha_Activo le incluyo por mantenimiento: si una fila lleva desactivada el mismo tiempo que el que se ha de conservar el histórico, se elimina.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:49.