none
duda con insercion de datos en tablas relacionadas RRS feed

  • Pregunta

  • hola amigos,

    les comento que estoy haciendo unos insert's desde .net, a unas tablas en sql server 2008..

    tengo la tabla postulante dond su PK es postulante_id (NO EL RUT)....y tengo la tabla postulacion donde tiene como FK el ID del postulante...

    el problema es que es para el postulante tengo habilitado la "especificacion de identidad" es decir se autogenera...

    entonces...cuando hago la transaccion hago primero el insert en POSTULANTE pero despues no se que ID pasar a la tabla POSTULACION....no se si me explico...

    como puedo crear la relacion entre ambas tablas al momento de insertar un nuevo postulante????

    desde ya muchas gracias

    jueves, 8 de marzo de 2012 12:28

Respuestas

  • Tras hacer la inserción en la tabla postulante, ejecuta el comando Select scope_identity() que te devuelve el ultimo valor de identidad generado en el contexto que estás y usa ese valor para insertar en la tabla postulación.

    Saludos


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta MaxelRorro jueves, 8 de marzo de 2012 19:13
    jueves, 8 de marzo de 2012 12:34
    Moderador

Todas las respuestas

  • Tras hacer la inserción en la tabla postulante, ejecuta el comando Select scope_identity() que te devuelve el ultimo valor de identidad generado en el contexto que estás y usa ese valor para insertar en la tabla postulación.

    Saludos


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta MaxelRorro jueves, 8 de marzo de 2012 19:13
    jueves, 8 de marzo de 2012 12:34
    Moderador
  • por ejemplo asi lo hago:

    cmd.ComandText = @"INSERT INTO POSTULANTE

                                        VALUES (@param1,@param2.....)";

    cmd.Parameters.Clear();

    cmd.Parameters.AddWithValue("@param1", valor1);

    cmd.Parameters.AddWithValue("@param2", valor2);

    .....

    //AQUI COMO OBTENGO EL ID QUE TU ME DICES???? COMO HAGO EL SELECT scope_identity()???

    ....

    cmd.ComandText = @"INSERT INTO POSTULACION

                                        VALUES (@ID_OBTENIDO,@param2.....)";

    cmd.Parameters.Clear();

    cmd.Parameters.AddWithValue("@ID_OBTENIDO",ID);

    cmd.Parameters.AddWithValue("@param2", valor2);

    cabe mencionar que io trabajo con c#

    jueves, 8 de marzo de 2012 12:42
  • Lo suyo sería encapsularlo dentro de un procedimiento almacenado y devolver el valor de identidad generado mediante un parámetro de salida. Algo como

    CREATE PROC sproc_ins_postulante
       @param1 INT
       , @param2 INT
       , @identity INT
    
    AS
        INSERT postulante (col1, col2)
        VALUES (@param1, @param2)
    
       SET @identity = SCOPE_IDENTITY()

    jueves, 8 de marzo de 2012 12:49
  • Yo lo que haria, si tu idea es usar VB.net es, en la linea que pones en negrita tira la consulta

    Select IDENT_CURRENT( 'table_name' ) de esa forma te evitas cualquier error.

    Saludos

    jueves, 8 de marzo de 2012 12:59
  • El problema de IDENT_CURRENT es que puede arrojar valores no correctos dependiendo de la concurrencia, ya que el alcance es sobre todas las sesiones abiertas y cualquier ámbito, mientras que SCOPE_IDENTITY() se limita a la conexión que está ejecutando el INSERT y en ese ámbito.

    IDENT_CURRENT [http://msdn.microsoft.com/es-es/library/ms175098.aspx]

    jueves, 8 de marzo de 2012 13:04
  • Tal como te dice carlos, ident_current no es buena idea, si dos sesiones concurrentes insertan en la misma tabla a ambas puede devolverles el mismo valor (el último de la tabla) select @@identity puede tener el problema de que la tabla tenga algún trigger en el que a su vez se inserte en tablas con identity, y el que queda libre de ambos problemas es el que yo propuse

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 8 de marzo de 2012 13:59
    Moderador
  • prueba así (es pseudocódigo así que posiblemente tengas que arreglarlo)

    cmd.ComandText = @"INSERT INTO POSTULANTE

                                        VALUES (@param1,@param2.....); SELECT @param_N=scope_identity();";

    cmd.Parameters.Clear();

    cmd.Parameters.AddWithValue("@param1", valor1);

    cmd.Parameters.AddWithValue("@param2", valor2);

    cmd.parameters.add("@param_n",... y le tienes que decir que es output..)

    Hay más mecanismos.

    aquí tienes algunos ejemplos

    http://msdn.microsoft.com/es-es/library/yy6y35y8(v=vs.80).aspx


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 8 de marzo de 2012 14:02
    Moderador