Tsql 如何从存储过程中抑制存储过程的结果?

Tsql 如何从存储过程中抑制存储过程的结果?,tsql,stored-procedures,Tsql,Stored Procedures,我有一个存储过程,我们称之为a,它调用另一个存储过程,我们称之为B。B包含一个我不想发送回a调用方的选择 这里有一些非常粗糙的伪代码,但它应该能让人理解 PROCEDURE A CURSOR CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B END SELECT * END PROCEDURE B Do some interesting things SELECT * END 正如您在上面所看

我有一个存储过程,我们称之为a,它调用另一个存储过程,我们称之为B。B包含一个我不想发送回a调用方的选择

这里有一些非常粗糙的伪代码,但它应该能让人理解

PROCEDURE A
    CURSOR
        CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B
    END
    SELECT *
END
PROCEDURE B
    Do some interesting things
    SELECT *
END
正如您在上面所看到的,A调用B,B做一些我想要的事情,并返回我不关心的结果。完成后,它将返回自己的结果集


如何抑制A中B的结果?我正在使用SQLServer2005。我不想对B进行更改,因为它工作正常,而且比我想处理的更复杂。

您可以尝试以下方法:

/* Assume this table matches the output of your procedure */
DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue 
EXEC ProcedureB

我真的很笨,但不应该在另一个程序中做一些有趣的事情吗?
然后过程A调用过程C,过程C只做一些有趣的事情,然后执行它所需的选择,过程B也可以调用过程C并执行它的选择,不需要第二个select和一个只用作垃圾箱的临时表,这里有一个对过程a&B的轻微修改,可以满足您的需要:

PROCEDURE A
    CURSOR
        CREATE TABLE #__suppress_results (col1 int)
        CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B
    END
    SELECT *
END
PROCEDURE B
    Do some interesting things
    IF OBJECT_ID('tempdb..#__suppress_results') IS NULL BEGIN
      SELECT *
    END
END
这避免了嵌套INSERT…EXEC的问题,并保留了proc B的现有行为。如果在调用proc B之前其他调用proc已经创建了名为_suppress_results的临时表,只需使用不同的名称,如_@suppress_results


这是可行的,因为如果从过程A调用过程B,那么“抑制”结果在过程B中是可见的。

OP不希望对执行某些工作然后返回结果(如新创建行的id)的SP的非常常见的位进行更改。这是一个很好的解决方案。但它仍然会导致开销,不是吗?我认为应该有一个像SET NORESULTSETS ON这样的选项。我几乎总是因为SP的副作用而调用它,我对它的输出不感兴趣。这种方法的问题是,只能将insert嵌套到exec中。因此,如果在父级中使用相同的方法,事情将崩溃。向过程B添加一个参数,以便它知道何时跳过结果集,修改过程a,以便它在必要时使用此新参数。