【问题标题】:How do I suppress results from multiple stored procedures如何抑制来自多个存储过程的结果
【发布时间】:2012-07-07 00:12:31
【问题描述】:

我有一个存储过程 sp_1,它调用另一个存储过程 sp_1_1。

我知道如何使用this trick 抑制 sp_1_1 的结果。

真正的问题是 sp_1_1 本身也调用了另一个存储过程 sp_1_1_1,它也将其结果返回给 sp_1_1!

我不能更改 sp_1_1 或 sp_1_1_1,只能更改 sp_1。

返回给 sp_1 的结果是 2 个记录集,第一个来自 sp_1_1,第二个来自 sp_1_1_1。

总结:

sp_1(需要抑制从下面返回的两个记录集)

+---- sp_1_1(返回自己的结果,然后从下面的结果)

+----------sp_1_1_1(返回结果)

【问题讨论】:

  • ... 这听起来确实像是一个重构的机会(即,将sp_1_1sp_1_1_1 拆分为两个过程)。压制你的结果实际上只是短期的收获。我不知道可以从 SP 中返回两个不同的结果集(不过,我从来没有把它们弄乱过)——你能不能像你的例子一样创建两个临时表?
  • 尽管您的建议听起来不错,但重构 sp_1_1 和 sp_1_1_1(显然不是真正的 sp 名称,只是为了清晰起见的别名)根本不是一种选择,因为它们被使用反馈的其他进程使用。不过感谢您的反馈。
  • SQL Server "Denali" 为您提供了处理结果集的新选项。在这种情况下,因为您正在嵌套,所以您显然不能使用插入/执行技巧。如果您不想重构太多,一个笨拙的解决方法是使用默认值向 proc 添加一个参数,例如 @SuppressResults bit = false

标签: sql sql-server-2008 suppress


【解决方案1】:

首先,顺便说一句,SQL Server“Denali”为您提供了处理结果集的新选项。

在这种情况下,因为您正在嵌套,所以您显然不能使用插入/执行技巧。

如果您不想重构太多,一个笨拙的解决方法是向 proc 添加一个具有默认值的参数,例如@SuppressResults bit = false。

然后,在需要嵌套的例程中,使用@SuppressResult=True 显式调用它,然后在@SuppressResults=True 时更改例程中的代码以不选择结果。

重要的是提供一个默认值并将参数放在最后。这将防止从代码库中的其他地方对例程的现有调用需要更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多