【问题标题】:Call Stored Procedure within Create Trigger in SQL Server在 SQL Server 的创建触发器中调用存储过程
【发布时间】:2011-04-15 15:50:26
【问题描述】:

我有一个名为 insert2Newsletter 的存储过程,带有参数

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

我想在插入触发器中调用这个存储过程。如何从 insert 中检索相应的字段以及如何在触发器中调用 insert2Newsletter?

我试过没有成功:

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

非常感谢您的反馈...问候...

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    我认为您将不得不遍历“插入”表,其中包含所有已更新的行。如果主键是 GUID,则可以使用 WHERE 循环或 WITH 语句。这是更简单的(对我来说)写,所以这是我的例子。我们使用这种方法,所以我知道它工作正常。

    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
    

    我当然希望这对您有所帮助。干杯!

    【讨论】:

    • 请注意,要使其正常工作,您需要将 WHILE @i &lt; @count 更改为 WHILE @i &lt;= @count 或将初始化更改为 i int = 0 否则它实际上不适用于其中一个条目,我希望你不是对所有触发器使用这种方法;-)
    • @enderland - 你是对的。我已经更新了示例代码。感谢您接听!
    【解决方案2】:

    终于……

    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
    

    【讨论】:

    • 插入多条记录会怎样?这会破坏。
    • @starskythehutch 不应该在每次插入时触发触发器,这样您就不需要从 Inserted 遍历每一行?除非触发器仅在存储过程中的所有插入完成(如批处理)时触发?
    • 这是一个 8 年前的评论,但无论如何我都会回复。触发器每次插入只触发一次,而不是每行一次。一个插入语句可以对多行​​进行操作。
    【解决方案3】:

    以下应该可以解决问题 - 只有 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=''+@cDate+'' Where Catagory_ID=@id   --@UserID
        Insert into Catagory_Master (Catagory_id,Catagory_Name) values(12,'Testing11')
    END 
    

    【讨论】:

      【解决方案4】:

      您在 EXEC 中传递了一个未定义的 rAgent_IP 参数,而不是局部变量 @rAgent_IP。

      不过,如果您执行多记录 INSERT 语句,此触发器将失败。

      【讨论】:

      • 我调整了@rAgent_IP。它仍然不起作用。多记录 INSERT 不会
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      相关资源
      最近更新 更多