【问题标题】:How do I suppress the results from a stored procedure from within a stored procedure?如何从存储过程中抑制存储过程的结果?
【发布时间】:2009-02-20 23:37:58
【问题描述】:

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

【问题讨论】:

  • 向过程 B 添加一个参数以便它知道何时跳过结果集,修改过程 A 以便在必要时使用这个新参数。

标签: tsql stored-procedures


【解决方案1】:

你可以试试这样的:

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

【讨论】:

  • 这是一个很好的解决方案。但它仍然会导致开销,不是吗?我认为应该有像SET NORESULTSETS ON 这样的选项。我几乎总是只因为它的副作用而调用 SP,我对它的输出不感兴趣。
  • 这种方法的问题是你只能嵌套insert into exec。因此,如果您在父级中使用相同的方法,事情就会崩溃。
【解决方案2】:

我真的很笨,但“做一些有趣的事情”不应该在另一个程序中吗? 然后过程 A 将调用过程 C(它只执行“做一些有趣的事情”),然后进行所需的选择,过程 B 也可以调用过程 C 并进行选择,而不是产生第二次选择和临时表的开销只用作垃圾箱?

【讨论】:

  • OP "不希望对 B 进行更改"
  • SP 做一些工作然后返回结果是很常见的,比如新创建的行的 id。
【解决方案3】:

以下是对 proc 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在调用proc B之前已经创建了一个名为#__suppress_results的临时表,只需使用不同的名称,比如#__@supress_results。

它可以工作,因为如果从 proc A 调用 proc B,#__suppress_results 在 proc B 中是可见的。

【讨论】:

  • 当您的 proc 已经在各处使用时,这是一个很好的选择,因此您不能只进行更改。这使您可以包装它们。厚颜无耻的全局变量。
  • 哈,这是一个不错的解决方案。向年轻的我致敬!我想念 T-SQL 编程。
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多