使用参数在sql server中的触发器内执行存储过程

Posted

技术标签:

【中文标题】使用参数在sql server中的触发器内执行存储过程【英文标题】:Execute a stored procedure within a trigger in sql server with parameters 【发布时间】:2017-01-31 17:34:42 【问题描述】:

我创建了一个触发器,它将在 INSERT 上执行存储过程:

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 ALTER TRIGGER [dbo].[trigger_name] ON [dbo].[table_name]
  AFTER INSERT AS
  BEGIN
    SET NOCOUNT ON
    EXEC procedure_name_exec param1, param2, param3
  END

我想要实现的是使用参数执行存储过程,这些参数代表刚刚插入的行并且基本上触发了这个触发器。

【问题讨论】:

感谢@TheGameiswar 的编辑 由于参数需要是插入行的值,因此您必须在此处使用循环,因为插入的表可以并且将有超过 1 行。您需要为每一行调用此过程。 我不想要循环,每次插入一行时触发器都应该执行该过程。 这不是触发器在 sql server 中的工作方式。他们每次操作一次而不是每行一次。如果您有一个插入超过 1 行的插入,并且您的触发器没有处理每一行,那么您的逻辑将无法正常工作。 操作为插入,插入为一行。因此我不需要循环 【参考方案1】:

我遇到了类似的问题,我是这样解决的。

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 ALTER TRIGGER [dbo].[trigger_name] ON [dbo].[table_name]
  AFTER INSERT AS
  BEGIN
    SET NOCOUNT ON
    DECLARE @nRows INT;
    DECLARE @var1 DATETIME;
    DECLARE @InsertedDates TABLE (
        NewDate DATETIME
    );

    INSERT INTO @InsertedDates
    SELECT [column name]
    FROM INSERTED;

    SELECT @nRows = COUNT(*) FROM @InsertedDates;

    WHILE @nRows > 0
    BEGIN
        SELECT TOP 1 @var1 = NewDate FROM @InsertedDates;

        EXEC    procedure_name_exec @var1;

        DELETE FROM @InsertedDates 
        WHERE @var1 = NewDate;

        SELECT @nRows = COUNT(*) FROM @InsertedDates;
    END;
  END;

一般的想法是认识到Inserted 是一个表,您需要处理每一行。我通过制作表的副本(不确定是否有必要)并处理表变量来做到这一点,然后从表变量中删除我处理的行。

注意:如果处理插入的重复项很重要,那么您需要对它们进行计数并多次调用存储过程。

【讨论】:

【参考方案2】:

这是我正在寻找的内容并给了我想要的结果:

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 ALTER TRIGGER [dbo].[trigger_name] ON [dbo].[table_name]
  AFTER INSERT AS
  BEGIN
    SET NOCOUNT ON
    declare @var1 DATETIME
    SELECT @var1 = inserted.[column name] 
    FROM inserted

    EXEC procedure_name_exec @var1
  END

【讨论】:

这在逻辑上是有缺陷的,因为插入的表是一个表,而不是一组标量值。如果您从过程中捕获的内容与行数据相关,那么您的代码中有一个主要问题。

以上是关于使用参数在sql server中的触发器内执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server——触发器

SQL Server T—SQL 存储过程 触发器

为啥我们不能在 SQL Server 中的函数内执行存储过程

数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器

SQL Server 存储过程和触发器

SQL SERVER 触发器