none
Trigger after insert para varias filas RRS feed

  • Pregunta

  • Hola buenas tardes, tengo el siguiente trigger y al recibir un conjunto de valores , solo me agrega 1 sola fila , alguien me podria dar una mano para entender mi error porfavor. 

    CREATE TRIGGER [dbo].[trg_MET]
    ON [dbo].[MET]
    after insert 
    as 
    BEGIN
    	set nocount on;
    	Declare 
    			@Time_Stamp datetime2(7)
               ,@Time_Stamp_ms int
               ,@MET_WS float
               ,@MET_WD float
               ,@MET_AT float
               ,@MET_RH float
               ,@MET_AP float
               ,@MET_GR1 float
               ,@MET_GR2 float
               ,@MET_ERV1 float
               ,@MET_ST1 float
               ,@MET_BAT float
    
    
     SELECT @Time_Stamp = Time_Stamp
    		,@Time_Stamp_ms = Time_Stamp_ms
    		,@MET_WS = MET_WS
    		,@MET_WD = MET_WD
    		,@MET_AT = MET_AT
    		,@MET_RH = MET_RH
    		,@MET_AP = MET_AP
    		,@MET_GR1 = MET_GR1
    		,@MET_GR2 = MET_GR2
    		,@MET_ERV1 = MET_ERV1
    		,@MET_ST1 = MET_ST1
    		,@MET_BAT = MET_BAT
    
     FROM MET
    
     begin
    	INSERT INTO dbOperacion.ove.MET 
    	values ( @Time_Stamp 
          ,@Time_Stamp_ms 
          ,@MET_WS 
          ,@MET_WD 
          ,@MET_AT 
          ,@MET_RH 
          ,@MET_AP 
          ,@MET_GR1 
          ,@MET_GR2 
          ,@MET_ERV1 
          ,@MET_ST1 
          ,@MET_BAT )
     end
    END 

    De antemano muchas gracias.

    jueves, 28 de mayo de 2020 16:21

Respuestas

  • En la parte del medio de tu procedimiento, donde haces "Select <variables> from MET", eso selecciona todos los registros uno por uno y los va asignando a las variables. Cuando termina, en las variables solo queda cargado el último valor que se seleccionó. Que por cierto no tiene por qué ser ninguno de los registros que insertaste, si lo es es únicamente por casualidad y puede fallarte en cualquier momento.

    Es mucho más sencillo de resolver de lo que crees. No necesitas variables ni nada. Simplemente inserta en la tabla de destino el resultado de hacer un Select sobre la pseudo-tabla INSERTED. Esta pseudo-tabla, dentro de un trigger, contiene la colección de registros que ocasionaron el disparo del trigger.

    CREATE TRIGGER [dbo].[trg_MET]
    ON [dbo].[MET]
    after insert 
    as 
    BEGIN
       set nocount on;
       INSERT INTO dbOperacion.ove.MET 
       SELECT (Time_Stamp
    	,Time_Stamp_ms
    	,MET_WS
    	,MET_WD
    	,MET_AT
    	,MET_RH
    	,MET_AP
    	,MET_GR1
    	,MET_GR2
    	,MET_ERV1
    	,MET_ST1
    	,MET_BAT)
       FROM INSERTED
    END

    • Propuesto como respuesta Javi Fernández F jueves, 28 de mayo de 2020 18:17
    • Marcado como respuesta SebaSQL jueves, 28 de mayo de 2020 18:24
    jueves, 28 de mayo de 2020 17:31

Todas las respuestas

  • En la parte del medio de tu procedimiento, donde haces "Select <variables> from MET", eso selecciona todos los registros uno por uno y los va asignando a las variables. Cuando termina, en las variables solo queda cargado el último valor que se seleccionó. Que por cierto no tiene por qué ser ninguno de los registros que insertaste, si lo es es únicamente por casualidad y puede fallarte en cualquier momento.

    Es mucho más sencillo de resolver de lo que crees. No necesitas variables ni nada. Simplemente inserta en la tabla de destino el resultado de hacer un Select sobre la pseudo-tabla INSERTED. Esta pseudo-tabla, dentro de un trigger, contiene la colección de registros que ocasionaron el disparo del trigger.

    CREATE TRIGGER [dbo].[trg_MET]
    ON [dbo].[MET]
    after insert 
    as 
    BEGIN
       set nocount on;
       INSERT INTO dbOperacion.ove.MET 
       SELECT (Time_Stamp
    	,Time_Stamp_ms
    	,MET_WS
    	,MET_WD
    	,MET_AT
    	,MET_RH
    	,MET_AP
    	,MET_GR1
    	,MET_GR2
    	,MET_ERV1
    	,MET_ST1
    	,MET_BAT)
       FROM INSERTED
    END

    • Propuesto como respuesta Javi Fernández F jueves, 28 de mayo de 2020 18:17
    • Marcado como respuesta SebaSQL jueves, 28 de mayo de 2020 18:24
    jueves, 28 de mayo de 2020 17:31
  • Muchas gracias por la respuesta, indagare mas sobre como funcionan esas tablas ocultas de los triggers. 
    jueves, 28 de mayo de 2020 18:25
  • Hola SebaSQL

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

     

     Andres Aguilar

    ____________________________ 

     

    jueves, 28 de mayo de 2020 19:59
    Moderador