locked
Como insertar un dato y que te devuelva el ID que le asigno... SQL Server RRS feed

  • Pregunta

  • Hola a todos, como estan???

    Bueno tengo un problemita, necesito insertar un dato en SQL server 2005 y que este me devuelva automaticamente el valor del indice "el valor autonumero" y se lo asigne a una variable...

    Es decir supongamos que tengo una tabla llamada persona con dos campos...

    TABLA PERSONA: id (autonumerico)    /    nombre

    DECLARE @a int

    INSERT

     

    INTO persona ([nombre]) VALUES ('perdro')

    return set @a = 1

     Algo asi, obviamente no es la sintaxis, pero necesito que me devuelva el valor del ID sin la necesidad de tener que hacer una consulta...

    De antemano mil gracias por toda su ayuda...

    miércoles, 7 de abril de 2010 19:27

Respuestas

  • Hola.

    Sería usando scope_identity():

    declare @a int

    insert into persona(nombre) values ('alberto')

    select @a = scope_identity

     

    Si tienes dudas, nos dices.

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    miércoles, 7 de abril de 2010 19:37
    Moderador
  • Hola AdyIr

    Lo que requieres es usar @@IDENTITY

    Después de insertar puedes usar esta variable del sistema para obtener el último valor Identity insertado en tu base de datos

    Debes de tener cuidado, en el sentido de que si haces inserts masivos, te devolvera solo él ultimo Identity insertado

    Te dejo la liga de ayuda de microsoft para este tema

    http://technet.microsoft.com/es-es/library/ms187342.aspx

    ahí encontraras un ejemplo sobre el uso de esta variable.

    Espero te sirva y dejame saber como te va.

    Saludos

    Jesús Gil

    Solid Quallity Mentors

    http://www.solidq.com

     

    • Marcado como respuesta AdyIr jueves, 8 de abril de 2010 20:09
    miércoles, 7 de abril de 2010 19:39
  • Hola.

    Jesús, con el debido respeto, como indican los Books Online justo en el link que has indicado, scope_identity() se limita al ámbito actual, pero no así @@identity. Es por ello que para la finalidad que persigue el OP (y para la mayoría de los escenarios) se recomienda el uso de scope_identity().

    Te adjunto un link donde el MVP Pinal Dave lo explica, aunque puedes encontrar un montón más de referencias sobre lo mismo:

    http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

     

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    • Marcado como respuesta AdyIr jueves, 8 de abril de 2010 20:09
    miércoles, 7 de abril de 2010 19:51
    Moderador
  • Lo que requieres es usar @@IDENTITY

    Después de insertar puedes usar esta variable del sistema para obtener el último valor Identity insertado en tu base de datos

    Debes de tener cuidado, en el sentido de que si haces inserts masivos, te devolvera solo él ultimo Identity insertado

    Observar que @@IDENTITY podría devolver un valor no deseado.

    Por ejemplo, tenemos una tabla A con un autonumérico y hay un trigger definido en la tabla A que provoca la creación de otro autonumérico en una tabla B, entonces @@IDENTITY retornará el valor del autonumérico de B y no el de A.

    Lo correcto es usar SCOPE_IDENTITY().

     

     


    Gustavo Larriera Sosa, Microsoft MVP | ascii164.blogspot.com | /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    • Marcado como respuesta AdyIr jueves, 8 de abril de 2010 20:10
    miércoles, 7 de abril de 2010 19:52
    Moderador

Todas las respuestas

  • Hola.

    Sería usando scope_identity():

    declare @a int

    insert into persona(nombre) values ('alberto')

    select @a = scope_identity

     

    Si tienes dudas, nos dices.

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    miércoles, 7 de abril de 2010 19:37
    Moderador
  • Hola AdyIr

    Lo que requieres es usar @@IDENTITY

    Después de insertar puedes usar esta variable del sistema para obtener el último valor Identity insertado en tu base de datos

    Debes de tener cuidado, en el sentido de que si haces inserts masivos, te devolvera solo él ultimo Identity insertado

    Te dejo la liga de ayuda de microsoft para este tema

    http://technet.microsoft.com/es-es/library/ms187342.aspx

    ahí encontraras un ejemplo sobre el uso de esta variable.

    Espero te sirva y dejame saber como te va.

    Saludos

    Jesús Gil

    Solid Quallity Mentors

    http://www.solidq.com

     

    • Marcado como respuesta AdyIr jueves, 8 de abril de 2010 20:09
    miércoles, 7 de abril de 2010 19:39
  • AdyIR

    te anexo la liga de un blog que escribio Pinal Dave un compañero de Solid Quality Mentors, en el cual explica los 3 metodos para acceder al último Identity insertado en la tabla

    http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

    Espero te sirva para tomar la mejor opción para tí.

    Saludos

    Jesús Gil

    Solid Quality Mentors

    miércoles, 7 de abril de 2010 19:48
  • Hola.

    Jesús, con el debido respeto, como indican los Books Online justo en el link que has indicado, scope_identity() se limita al ámbito actual, pero no así @@identity. Es por ello que para la finalidad que persigue el OP (y para la mayoría de los escenarios) se recomienda el uso de scope_identity().

    Te adjunto un link donde el MVP Pinal Dave lo explica, aunque puedes encontrar un montón más de referencias sobre lo mismo:

    http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

     

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    • Marcado como respuesta AdyIr jueves, 8 de abril de 2010 20:09
    miércoles, 7 de abril de 2010 19:51
    Moderador
  • Lo que requieres es usar @@IDENTITY

    Después de insertar puedes usar esta variable del sistema para obtener el último valor Identity insertado en tu base de datos

    Debes de tener cuidado, en el sentido de que si haces inserts masivos, te devolvera solo él ultimo Identity insertado

    Observar que @@IDENTITY podría devolver un valor no deseado.

    Por ejemplo, tenemos una tabla A con un autonumérico y hay un trigger definido en la tabla A que provoca la creación de otro autonumérico en una tabla B, entonces @@IDENTITY retornará el valor del autonumérico de B y no el de A.

    Lo correcto es usar SCOPE_IDENTITY().

     

     


    Gustavo Larriera Sosa, Microsoft MVP | ascii164.blogspot.com | /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    • Marcado como respuesta AdyIr jueves, 8 de abril de 2010 20:10
    miércoles, 7 de abril de 2010 19:52
    Moderador
  • correcto Scope_Identity para evitar los problemas que han comentado

    Alberto, por eso mencioné el blog de Pinal para tener los 3 metodos de como obtener un identitiy

    Gracias por las observaciones.

    Jesús Gil

    miércoles, 7 de abril de 2010 20:27
  • Lo que requieres es usar @@IDENTITY

    Después de insertar puedes usar esta variable del sistema para obtener el último valor Identity insertado en tu base de datos

    Debes de tener cuidado, en el sentido de que si haces inserts masivos, te devolvera solo él ultimo Identity insertado

    Observar que @@IDENTITY podría devolver un valor no deseado.

    Por ejemplo, tenemos una tabla A con un autonumérico y hay un trigger definido en la tabla A que provoca la creación de otro autonumérico en una tabla B, entonces @@IDENTITY retornará el valor del autonumérico de B y no el de A.

    Lo correcto es usar SCOPE_IDENTITY().

     

     


    Gustavo Larriera Sosa, Microsoft MVP | ascii164.blogspot.com | /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/

     

    Hola a todos mil gracias por sus respuesta, la verdad no supe a quien citar...

    Una preguntita...

    Cual es la diferencia entre el IDENT_CURRENT('Tabla') y el SCOPE_IDENTITY() que no la entendi muy bien

    Otro link muy bien q encontre es este

    http://wiki.lessthandot.com/index.php/6_Different_Ways_To_Get_The_Current_Identity_Value

    Otra pregunta

     Que pasa si hay cientos de usuarios "por ejemplo" utilizando la aplicacion, y yo hago al parecido a esto "por decir cualquier disparate...

    INSERT INTO Persona ([nombre], [apellido])

    DECLARE

     

    @indice int

    SELECT

     

    @indice = IDENT_CURRENT('Persona')

    INSERT

     

    INTO Persona2 ([ID_Persona], [Telefono]) 

    SELECT

     

    @indiceLibreta, '11616161'

    Y por casualidad de la vida otro usuarios tambien guardo al momento... Existe la posibilidad de que me devuelva el id del registro que guardo la otra persona? Claro quiza es algo que muy remota la posibilidad de que pase, solo quiero comprender bien estas funciones...

    Mil gracias a todos por su gran ayuda...

    miércoles, 7 de abril de 2010 22:14
  • Hola.

    Jesús, con el debido respeto, como indican los Books Online justo en el link que has indicado, scope_identity() se limita al ámbito actual, pero no así @@identity. Es por ello que para la finalidad que persigue el OP (y para la mayoría de los escenarios) se recomienda el uso de scope_identity().

    Te adjunto un link donde el MVP Pinal Dave lo explica, aunque puedes encontrar un montón más de referencias sobre lo mismo:

    http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

     

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)

     

    Hola como estas.. Sera que me ayudas en mi otra pregunta que hice mas abajo, mil gracias....

    miércoles, 7 de abril de 2010 22:36
  • Hola.

    Si lo que tú quieres es obtener el identificador que se ha insertado en la tabla de referencia y por la instrucción de justo encima, necesitas usar scope_identity(). Las otras dos funciones pueden ocasionarte una situación como la que comentas, que no se obtenga el id insertado, sino el que se insertó por otro usuario en otra sesion. Scope_Identity() garantiza eso, las otras dos no.

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    jueves, 8 de abril de 2010 6:59
    Moderador
  • Hola.

    Si lo que tú quieres es obtener el identificador que se ha insertado en la tabla de referencia y por la instrucción de justo encima, necesitas usar scope_identity(). Las otras dos funciones pueden ocasionarte una situación como la que comentas, que no se obtenga el id insertado, sino el que se insertó por otro usuario en otra sesion. Scope_Identity() garantiza eso, las otras dos no.

     


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)


    Perfecto muchas gracias, todo esta claro...

    jueves, 8 de abril de 2010 20:09