none
Que sucede por que me da error al insertar? RRS feed

  • Pregunta

  • Por que me da error al insertar datos si estoy insertando en la tablas cuando no existen,me explico debo hacer lo siguiente: cuando inserte un teléfono en la tabla tercero_vs_telefono que no exista debe insertarlo en la tabla de teléfono y también en la tabla Dueño_Principal.

    create trigger InsertarEnTelefono
    on Tercero_VS_Telefono for insert
    as
     if not exists( select* from Telefono where Numero_Telefono=(select Telefono from inserted))
     begin
         insert telefono values((select Telefono from inserted),1);
         insert Dueño_Principal(ID,Telefono)values((select Tercero from inserted),(select Telefono from inserted))
     end


    viernes, 30 de junio de 2017 2:11

Respuestas

  • te recomiendo que uses el comando merge, y que compruebes que inserted no tiene duplicados

    Yo empezaría con algo como

    select distinct teléfono into #ins from inserted 

    y a partir de ahí trabajaría con #ins y no con inserted


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

    viernes, 30 de junio de 2017 7:11
    Moderador
  • En principio lo que estas haciendo deberia funcionar... a condicion de que en INSERTED solo exista un único registro. Pero eso no es siempre asi, si haces un INSERT que inserte varios registros de golpe, entonces el trigger se dispara una sola vez (y NO una vez por cada registro), y dentro de INSERTED te llegan junjtos todos los registros que se insertaron. Si esto sucede, al hacer la subconsulta (select Telefono from inserted) te devuelve una lista de telefonos, y entonces da un error cuando intentas usar esa lista dentro de un campo escalar.

    El remedio es tratar INSERTED como una tabla con varios registros, no presumir que tiene uno solo. A partir de ese punto puedes usar cualquier instruccion SQL tal como insert into detino...select...from inserted, o bien la sentencia MERGE como ya te han sugerido.

    viernes, 30 de junio de 2017 10:58

Todas las respuestas

  • te recomiendo que uses el comando merge, y que compruebes que inserted no tiene duplicados

    Yo empezaría con algo como

    select distinct teléfono into #ins from inserted 

    y a partir de ahí trabajaría con #ins y no con inserted


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

    viernes, 30 de junio de 2017 7:11
    Moderador
  • En principio lo que estas haciendo deberia funcionar... a condicion de que en INSERTED solo exista un único registro. Pero eso no es siempre asi, si haces un INSERT que inserte varios registros de golpe, entonces el trigger se dispara una sola vez (y NO una vez por cada registro), y dentro de INSERTED te llegan junjtos todos los registros que se insertaron. Si esto sucede, al hacer la subconsulta (select Telefono from inserted) te devuelve una lista de telefonos, y entonces da un error cuando intentas usar esa lista dentro de un campo escalar.

    El remedio es tratar INSERTED como una tabla con varios registros, no presumir que tiene uno solo. A partir de ese punto puedes usar cualquier instruccion SQL tal como insert into detino...select...from inserted, o bien la sentencia MERGE como ya te han sugerido.

    viernes, 30 de junio de 2017 10:58