none
Insert sin utilizar ciclos - SQL RRS feed

  • Pregunta

  • Hola,

    Necesito una sugerencia de como insertar una consulta de varias filas a una tabla similares columnas, lo he hecho anteriormente pero con un update. Necesito insertar los registros uno a uno y no toda la consulta a la vez ya que la tabla tiene un trigger que no permite inserciones masivas.

    Agrego el ejemplo del update para ver si se toma la misma idea o hay otra manera optima de hacer el insert sin utilizar ciclos

    Este query actualiza cada fila de la tabla GC_PEDIDOS_DET en base al resultado de GC_MOVIMIENTO_PRODUCTO esto esta dentro de un procedimiento almacenado.

    UPDATE GC_PEDIDOS_DET SET CANTIDAD_PEDIDA=T.PESO, CANTIDAD_DESPACHADA=T.PESO, SUBTOTAL=T.PESO*PRECIO_VENTA FROM GC_PEDIDOS_DET PD INNER JOIN 
    (
    SELECT  (SELECT PRODUCTO FROM GC_MOVIMIENTO_PRODUCTO M WHERE M.NUMERO_PEDIDO=@NUMERO_PEDIDO AND M.PRODUCTO=MP.PRODUCTO GROUP BY PRODUCTO) PRODUCTO, SUM(PESO) PESO FROM GC_MOVIMIENTO_PRODUCTO MP WHERE MP.NUMERO_PEDIDO=@NUMERO_PEDIDO GROUP BY PRODUCTO
    ) T ON T.PRODUCTO=PD.PRODUCTO WHERE PD.NUMERO_PEDIDO=@NUMERO_PEDIDO

    Gracias de antemano.

    Saludos,

    Tony

    lunes, 19 de noviembre de 2018 16:47

Respuestas

  • Hola LLTony:

    Es sólo una idea, pero si el problema esta en que el trigger, no funciona con más de un registro, no será mejor modificar el trigger.

    Si lo pegas, lo cambiamos, por algo que funcione mejor.

    Por otro lado, he mirado tu consulta y no entiendo muy bien, ya que si lo que quieres realizar es insertar un registro de uno en  uno, para GC_PEDIDOS_DET, y usas procedimientos almacenados, solo tienes que hacer.

    CREATE PROCEDURE sp_GC_PEDIDOS_DET
    (@PRODUCTO  INT,
     @PESO      INT,
     @OTROCAMPO VARCHAR(100)
    )
    AS
        BEGIN TRY
            BEGIN TRAN;
            INSERT INTO GC_PEDIDOS_DET
    (PRODUCTO,
     PESO,
     XXX
    )
            VALUES
    (@PRODUCTO,
     @PESO,
     @OTROCAMPO
    );
            COMMIT TRAN;
        END TRY
        BEGIN CATCH
            ROLLBACK TRAN;
            THROW;
        END CATCH;

    Y llamarlo desde el software cliente, o desde otro procedure de uno en uno.

    Como entiendo que no es esto lo que pides, creo que tendrás que especificar un poco más.

    Ya comentas

    lunes, 19 de noviembre de 2018 17:08