2010-09-22 21 views
14

tengo un procedimiento almacenado llamado insert2Newsletter con parámetrosllamada de procedimiento almacenado dentro de CREATE TRIGGER en SQL Server

(@sex nvarchar(10), 
@f_name nvarchar(50), 
@l_name nvarchar(70), 
@email nvarchar(75), 
@ip_address nvarchar(50), 
@hotelID int, 
@maArt nchar(2)) 

Quiero llamar a este procedimiento almacenado en un desencadenador de inserción. ¿Cómo recupero los campos correspondientes de insertado y cómo puedo llamar a insert2Newsletter dentro del desencadenante?

he intentado sin éxito:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER RA2Newsletter 
    ON [dbo].[Reiseagent] 
    AFTER INSERT 
AS 
DECLARE @rAgent_Name nvarchar(50), 
DECLARE @rAgent_Email nvarchar(50), 
DECLARE @rAgent_IP nvarchar(50), 
DECLARE @hotelID int 

BEGIN 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    Select @rAgent_Name=rAgent_Name, @rAgent_Email=rAgent_Email, @rAgent_IP=rAgent_IP, @hotelID=hotelID From Inserted 
    EXEC insert2Newsletter '','',@rAgent_Name,@rAgent_Email,rAgent_IP,@hotelID,'RA' 


END 
GO 

THX mucho por su colaboración ... saludos ...

Respuesta

9

finalmente ...

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 

GO 
ALTER TRIGGER [dbo].[RA2Newsletter] 
    ON [dbo].[Reiseagent] 
    AFTER INSERT 
AS 
    declare 
    @rAgent_Name nvarchar(50), 
    @rAgent_Email nvarchar(50), 
    @rAgent_IP nvarchar(50), 
    @hotelID int, 
    @retval int 


BEGIN 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    Select @rAgent_Name=rAgent_Name,@rAgent_Email=rAgent_Email,@rAgent_IP=rAgent_IP,@hotelID=hotelID From Inserted 
    EXEC insert2Newsletter '','',@rAgent_Name,@rAgent_Email,@rAgent_IP,@hotelID,'RA', @retval 

END 
+2

¿Qué sucede si está insertando múltiples registros? Esto se rompería. – starskythehutch

0

se pasa un parámetro rAgent_IP indefinida en EXEC en lugar de la @rAgent_IP variable local.

Aún así, este disparador fallará si realiza una instrucción INSERT de múltiples registros.

+0

ajusté @rAgent_IP. Aún así no funciona. Un INSERT de múltiples registros no será – user168507

6

creo que tendrá que bucle sobre la mesa "insertada", que contiene todas las filas que fueron actualizadas. Puede usar un bucle WHERE o una instrucción WITH si su clave principal es un GUID. Este es el más simple (para mí) para escribir, así que aquí está mi ejemplo. Usamos este enfoque, así que sé con certeza que funciona bien.

ALTER TRIGGER [dbo].[RA2Newsletter] ON [dbo].[Reiseagent] 
    AFTER INSERT 
AS 
     -- This is your primary key. I assume INT, but initialize 
     -- to minimum value for the type you are using. 
     DECLARE @rAgent_ID INT = 0 

     -- Looping variable. 
     DECLARE @i INT = 0 

     -- Count of rows affected for looping over 
     DECLARE @count INT 

     -- These are your old variables. 
     DECLARE @rAgent_Name NVARCHAR(50) 
     DECLARE @rAgent_Email NVARCHAR(50) 
     DECLARE @rAgent_IP NVARCHAR(50) 
     DECLARE @hotelID INT 
     DECLARE @retval INT 

    BEGIN 
     SET NOCOUNT ON ; 

     -- Get count of affected rows 
     SELECT @Count = Count(rAgent_ID) 
     FROM inserted 

     -- Loop over rows affected 
     WHILE @i < @count 
      BEGIN 
       -- Get the next rAgent_ID 
       SELECT TOP 1 
         @rAgent_ID = rAgent_ID 
       FROM inserted 
       WHERE rAgent_ID > @rAgent_ID 
       ORDER BY rAgent_ID ASC 

       -- Populate values for the current row 
       SELECT @rAgent_Name = rAgent_Name, 
         @rAgent_Email = rAgent_Email, 
         @rAgent_IP = rAgent_IP, 
         @hotelID = hotelID 
       FROM Inserted 
       WHERE rAgent_ID = @rAgent_ID 

       -- Run your stored procedure 
       EXEC insert2Newsletter '', '', @rAgent_Name, @rAgent_Email, 
        @rAgent_IP, @hotelID, 'RA', @retval 

       -- Set up next iteration 
       SET @i = @i + 1 
      END 
    END 
GO 

Espero que esto te ayude. ¡Aclamaciones!

+1

Nota para que esto funcione, debe cambiar 'WHILE @i <@ count' para que sea' WHILE @i <= @ count' o cambie la inicialización para hacer 'i int = 0' o no funcionará para uno de entradas, espero que no esté utilizando este enfoque para todos sus factores desencadenantes ;-) – enderland

+0

@enderland - Tiene razón. He actualizado el código de ejemplo. Gracias por atrapar eso! –

1

El siguiente debe hacer el truco - Sólo SqlServer


Alter TRIGGER Catagory_Master_Date_update ON Catagory_Master AFTER delete,Update 
AS 
BEGIN 

SET NOCOUNT ON; 

Declare @id int 
DECLARE @cDate as DateTime 
    set @cDate =(select Getdate()) 

select @id=deleted.Catagory_id from deleted 
print @cDate 

execute dbo.psp_Update_Category @id 

END 

Alter PROCEDURE dbo.psp_Update_Category 
@id int 
AS 
BEGIN 

DECLARE @cDate as DateTime 
    set @cDate =(select Getdate()) 
    --Update Catagory_Master Set Modify_date=''[email protected]+'' Where [email protected] [email protected] 
    Insert into Catagory_Master (Catagory_id,Catagory_Name) values(12,'Testing11') 
END 

Cuestiones relacionadas