none
Utilizando el MAX RRS feed

  • Pregunta

  • Saludos dba una pregunta, tengo una bade de datos con un campo llamado id de tipo entero (int) que no es identity y donde recupero esta informacion de la siguiente manera SELECT MAX(id) + 1 FROM NombreTabla donde lo que hago es que cuando le doy a un boton me genera el ultimo codigo que este en id y le suma uno ahora bien, como puedo hacer para que en vez de que me almacene digitos entero , me almacene datos como este 00001, lo hago directamente en mi aplicacion, pero uso sentencias sql?

    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Me ha servido como ayuda"

    domingo, 30 de septiembre de 2012 19:44

Respuestas

  • Hola,

    Apollo el consejo que te da webjose, debes usar IDENTITY.

    Si lo que quieres es recurperar el ultimo IDENTITY, generado con la inserción de un nuevo registro, puedes hacerlo con la funcion: SCOPE_IDENTITY(), cargar el valor en una variable y usar esta para continuar con tu codigo o programa... te pongo un ejemplo:

    Create table Pedidos( NombrePedido varchar(10), Idpedido int identity(1,1) ); GO

    Declare @Idpedido int

    insert into Pedidos values ('Pedido01') --Justo después, capturas el ultimo autonumérico generado: select @IdPedido = SCOPE_IDENTITY() -- también puedes capturar error y otras necesidades que tengas… --usa @IdPedido para continuar con tu codigo o programa...



     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    • Editado Normannp domingo, 30 de septiembre de 2012 20:31
    • Marcado como respuesta J. Joaquin domingo, 30 de septiembre de 2012 22:25
    domingo, 30 de septiembre de 2012 20:25
  • Un nuevo Identity se asigna cuando se inserta un registro.  Después de la instrucción INSERT usted puede recuperar el nuevo valor con la funcón SCOPE_IDENITTY().

    INSERT Into dbo.tblTabla (...)
    Values (...)
    ;
    
    Declare @nuevoID int;
    
    Set @nuevoID = scope_identity();
    --Listo, la variable @nuevoID tiene el nuevo valor.
    --También @nuevoID puede ser un parámetro de salida de un
    --procedimiento almacenado para así recuperar el valor en C#.


    Jose R. MCP
    Code Samples


    • Editado webJose domingo, 30 de septiembre de 2012 20:28
    • Marcado como respuesta J. Joaquin domingo, 30 de septiembre de 2012 22:25
    domingo, 30 de septiembre de 2012 20:27

Todas las respuestas

  • Crear su propio ID es muy mala idea si su aplicación es multiusuarios.  Existe una variedad de casos en los cuales usted topará con ID's repetidos o registros sobreescritos simplemente porque no desea que SQL Server asigne el ID.

    Pero bueno, su problema específico lo resolvería yo con un campo calculado:

    Create Table dbo.tblTabla
    (
        ID int Not Null
        , CalcID As dbo.fnIDComoTexto(ID)
    );
    
    --Y esta sería la función:
    Create Function dbo.fnIDComoTexto(@id int)
    Returns nvarchar(10)
    As
    Begin
        Declare @strID nvarchar(10);
    
        Set @strID = Cast(@id as nvarchar(10));
        while (Len(@strID) < 5)
        Begin
            Set @strID = N'0' + @strID;
        End
    
        return @strID;
    End
    

    Le reitero que no usar IDENTITY es un dolor de cabeza en sistemas multiusuario.


    Jose R. MCP
    Code Samples

    domingo, 30 de septiembre de 2012 20:14
  • Ok web Jose una pregunta si no es una buena practica por lo que me explica yo puedo apartir de un identity, ir aumentandolo de 1 en 1 asi como lo estoy haciendo, y cual seria el procedimiento para recuperar un identity, seria lo mismo que recuperar un id normal??

    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Me ha servido como ayuda"

    domingo, 30 de septiembre de 2012 20:23
  • Hola,

    Apollo el consejo que te da webjose, debes usar IDENTITY.

    Si lo que quieres es recurperar el ultimo IDENTITY, generado con la inserción de un nuevo registro, puedes hacerlo con la funcion: SCOPE_IDENTITY(), cargar el valor en una variable y usar esta para continuar con tu codigo o programa... te pongo un ejemplo:

    Create table Pedidos( NombrePedido varchar(10), Idpedido int identity(1,1) ); GO

    Declare @Idpedido int

    insert into Pedidos values ('Pedido01') --Justo después, capturas el ultimo autonumérico generado: select @IdPedido = SCOPE_IDENTITY() -- también puedes capturar error y otras necesidades que tengas… --usa @IdPedido para continuar con tu codigo o programa...



     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    • Editado Normannp domingo, 30 de septiembre de 2012 20:31
    • Marcado como respuesta J. Joaquin domingo, 30 de septiembre de 2012 22:25
    domingo, 30 de septiembre de 2012 20:25
  • Un nuevo Identity se asigna cuando se inserta un registro.  Después de la instrucción INSERT usted puede recuperar el nuevo valor con la funcón SCOPE_IDENITTY().

    INSERT Into dbo.tblTabla (...)
    Values (...)
    ;
    
    Declare @nuevoID int;
    
    Set @nuevoID = scope_identity();
    --Listo, la variable @nuevoID tiene el nuevo valor.
    --También @nuevoID puede ser un parámetro de salida de un
    --procedimiento almacenado para así recuperar el valor en C#.


    Jose R. MCP
    Code Samples


    • Editado webJose domingo, 30 de septiembre de 2012 20:28
    • Marcado como respuesta J. Joaquin domingo, 30 de septiembre de 2012 22:25
    domingo, 30 de septiembre de 2012 20:27
  • Entiendo todo lo que me dicen y si ahora veo que es cierto, pero la unica dificultad que se me presenta es que para que se genere un identity tengo que insertar datos obligatoriamente, y en mi caso lo que hago en mi aplicacion es darle a un boton que se llama agregar cliente, y automaticamente me genera el identity sin insertar datos, como puedo hacerlo de esta manera que le acabo de explicar utilizando c#?

    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Me ha servido como ayuda"

    domingo, 30 de septiembre de 2012 22:06
  • En un sistema multiusuario es mala idea prometer un ID antes de tener el registro grabado correctamente pues existe la posibilidad de competir por el mismo ID.

    El resumen de la historia es:  Nunca prometa un ID de registro sin haber creado el registro.  ¿Por qué?  La historia larga a continuación (más o menos resumida).

    En un ambiente multiusuario existe la posibilidad de dos usuarios creando nuevos registros en una tabla.  La lógica actual de predecir el valor con MAX() + 1 predecirá el mismo ID para ambos usuarios.  ¿Qué hacer entonces?  Dos posibilidades:  Corregir este hecho o manejar el problema a la hora de insertar ya que con suerte alguno de los usuarios cancela o simplemente no termina el registro.

    La posibilidad 2 simplemente nulifica cualquier beneficio de predecir el ID:  ¿De qué me sirve un ID de antemano si a la hora de guardar el registro va a cambiar?  La respuesta es:  No sirve de nada.  Si no sirve de nada entonces ¿para qué molestarse en predecirlo en primer lugar?

    La posibilidad 1 entonces es la única posibilidad y se resuelve canalizando las peticiones por ID's nuevos a una cola sincronizada que es atendida uno a la vez.  Así las predicciones serán únicas para cada solicitante.  Pero, ¿qué pasa si un usuario no usa su ID?  ¿Cómo podemos reutilizarlo?  Es complicado pues muchas veces no se le da un tiempo máximo al usuario para completar el registro.  Entonces podemos implementar un tiempo máximo o bien decidir que el ID predicho se perderá para siempre.

    Pero si seguimos explorando la posibilidad simplemente nos vamos a dar cuenta de que estamos implementando EXACTAMENTE LO MISMO QUE UN IDENTITY.  ¿Para qué inventar lo que ya está inventado?

    Ah, y para responder a su pregunta de qué hacer en el sistema actual:  Como parche yo insertaría un registro en blanco para así obtener su IDENTITY y pasarlo al usuario.  Luego el usuario elegiría completar el registro o no.

    Pero nótese que el parche deja huella:  Habrán registros en la tabla que no fueron completados e idealmente habría que implementar un mecanismo de limpieza de estos registros.  O sea, al final y al cabo el uso de IDENTITY no tiene par.


    Jose R. MCP
    Code Samples


    • Editado webJose domingo, 30 de septiembre de 2012 22:18
    domingo, 30 de septiembre de 2012 22:15