Tsql 如何从存储过程中抑制存储过程的结果?
我有一个存储过程,我们称之为a,它调用另一个存储过程,我们称之为B。B包含一个我不想发送回a调用方的选择 这里有一些非常粗糙的伪代码,但它应该能让人理解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 正如您在上面所看
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,以便它在必要时使用此新参数。