忽略SQL触发器执行中的结果集

时间:2014-06-03 06:05:34

标签: sql sql-server stored-procedures triggers

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

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

    -- Call Stored Procedure
        exec MyProc
END

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

那么是否有任何可能的解决方案忽略触发器执行返回的结果集?我已经考虑过将一个位参数传递给MyProc的解决方案,指示是否通过触发器调用它,如果该位为1(意味着通过触发器调用),我不会从程序返回结果集,但这个解决方案正在影响触发器和程序两者,我想要的东西只能从触发器完成,而不需要触及程序。

1 个答案:

答案 0 :(得分:2)

如果您的存储过程总是只返回一个集合,则可以将其插入临时表中来禁止它。

示例存储过程:

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命令将抛出错误。