【问题标题】:Suppress stored procedure output when called in another stored procedure?在另一个存储过程中调用时抑制存储过程输出?
【发布时间】:2020-03-09 00:39:15
【问题描述】:

所以我有sproc1,它做了一些事情并返回一些行。重要的是它做了一些事情。我也有 sproc2 做一些事情,调用 sproc1 (它做自己的事情) 并返回它自己的行。问题是当我调用 sproc2 时,我得到 2 个结果集。第一个来自sproc1,第二个来自sproc2

sproc2中调用sproc1时是否可以轻松抑制它?

据我所知,我有两种方法可以做到这一点:

  • 使用临时表来捕获exec sproc 的输出。
  • C# 中导航到最后一个结果集并使用它,而忽略第一个结果集。

这些方法都不容易重复使用,因为:

  • 首先要求我CREATE一个与存储过程的输出相匹配的临时表
  • second 需要我遍历结果集以到达最后一个不知道哪个是最后一个,除非我尝试移动到下一个并通过 .NextResult() 失败。

如果 SQL Server 允许我在另一个存储过程中执行一个存储过程,但抑制内部执行它的输出,那么简单的方法是。或者如果SqlCommand 允许ExecuteReader(CommandBehavior.LastResult) 并会自行导航到最后一个结果。

两者中的任何一个都可以通过简单且可重用的方式实现吗?

真正的解决方案是将内部存储过程重构为writeread 组件。或者在内部存储过程中添加@param,以防止最终结果被选中。但我在这里偷懒!

【问题讨论】:

  • 将参数添加到第二个 sp 并在 sp2 中使用 "if": if not @suppress_results select....
  • 您可以使用 sepupic 选项或您在此处找到的其他选项:stackoverflow.com/questions/866484/…
  • 您已经浏览了所有可用的选项,现在需要选择最不麻烦的一个!
  • 这听起来像是 XY 问题。
  • @MitchWheat 我知道问题所在,我有解决方案,但我想知道是否有一些神秘的 SQLServer 知识,我可能不必比我已经知道如何更容易地处理这个问题。

标签: c# sql-server sqlclient


【解决方案1】:

所以 (现在,除非我找到更好的答案或有所改进)我最终添加了这个参数和一个默认值,所以我根本不必在C#端:

,@_Suppress bit = 0 -- prevent output via select

select 之前我添加:

if @_Suppress is null or @_Suppress = 0
select -- output results

此方法还需要您重构insert ... output 代码并输出到临时表中,最终仅在未抑制时才选择。

这是处理事情的最简单方法,但应该有这些情况的内部功能,例如:

begin suppress
exec some_sproc;
end suppress;

或一些特殊的语法,如sexec (如在被抑制的 exec 中) 或可以接受任何插入列格式并丢弃它的通用 NULL 表。

从现在开始,我可能会将这个论点添加到我的所有sprocs 中,这些sprocs 会产生结果并重构受此问题影响的旧版本。

【讨论】:

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