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

时间:2009-02-20 23:37:58

标签: tsql stored-procedures

我有一个存储过程(我们称之为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进行更改,因为它工作起来比我想要的更复杂。

3 个答案:

答案 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