【问题标题】:Ignore result sets in SQL trigger execution忽略 SQL 触发器执行中的结果集
【发布时间】:2014-06-03 06:05:34
【问题描述】:

我有一个调用存储过程的 SQL 触发器。像这样的

Alter TRIGGER [dbo].[MyTrigger]
   ON       [dbo].[MyTable]
   AFTER    INSERT, UPDATE
AS 
BEGIN
    -- Some t-sql

    -- Call Stored Procedure
        exec MyProc
END

现在的问题是过程MyProc 返回一个结果集,这是系统其他部分所需要的,但是我不希望通过此触发器执行此过程时返回该结果集,因为结果集每当我在MyTable 中更新/插入时都会返回,这是在其上创建触发器的表,我不希望每次更新/插入时都设置该结果。

那么这里有忽略触发器执行返回的结果集的任何可能的解决方案吗?我已经考虑过将位参数传递给MyProc 的解决方案,指示它是否通过触发器调用以及该位是否为1(表示通过触发器调用)我不会返回结果从过程中设置,但是这个解决方案会影响触发器和过程,我想要一些可以只从触发器完成而不接触过程的东西。

【问题讨论】:

    标签: sql sql-server stored-procedures triggers


    【解决方案1】:

    如果你的存储过程总是只返回一组,你可以禁止它插入到临时表中。

    示例存储过程:

    ALTER PROCEDURE [MyProc]
    AS
    BEGIN
      SELECT getdate() as today;
    END
    

    您的触发器应如下所示:

     Alter TRIGGER [dbo].[MyTrigger]
       ON       [dbo].[MyTable]
       AFTER    INSERT, UPDATE
    AS 
    BEGIN
        -- Some t-sql
    
        -- Call Stored Procedure
        CREATE TABLE #myproc_tmp (
           today datetime
        )
    
        INSERT INTO #myproc_tmp
        Exec MyProc
    
    END
    

    重要提示 - 如果存储过程返回的结果集结构发生变化,您将不得不编辑触发器。此外,如果过程返回大量数据,它会通过插入#myproc_tmp 表来消耗额外的服务器资源。 最后,如果 SP 返回多组不同结构的数据,INSERT INTO 命令会抛出错误。

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 2012-04-15
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2010-09-14
      相关资源
      最近更新 更多