我有一个存储过程(我们称之为A)调用另一个存储过程(我们称之为B)。 B包括一个我不想发回给A的调用者的SELECT。
这是一些非常粗糙的伪代码,但它应该得到这个想法。
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后,它会返回自己的一组结果。
如何抑制A中B的结果?我正在使用SQL Server 2005.我宁愿不对B进行更改,因为它工作起来比我想要的更复杂。
答案 0 :(得分:32)
您可以尝试这样的事情:
/* Assume this table matches the output of your procedure */
DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue
EXEC ProcedureB
答案 1 :(得分:1)
我真的是真正的屈膝,但是不应该在另一个程序中“做一些有趣的事情”吗? 然后,过程A将调用过程C(仅执行“做一些有趣的事情”)然后执行其所需的选择,过程B也可以调用过程C并执行其选择,而不是具有第二个选择和临时表的开销那只用作垃圾箱?
答案 2 :(得分:0)
这是对proc A& amp; 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
的临时表的机会,使用其他名称,例如#__@supress_results
。
并且它有效,因为如果从proc A调用proc B,则在proc B中可以看到#__suppress_results
。