在另一个存储过程中调用时抑制存储过程输出?

Posted

技术标签:

【中文标题】在另一个存储过程中调用时抑制存储过程输出?【英文标题】: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 选项或您在此处找到的其他选项:***.com/questions/866484/… 您已经浏览了所有可用的选项,现在需要选择最不麻烦的一个! 这听起来像是 XY 问题。 @MitchWheat 我知道问题所在,我有解决方案,但我想知道是否有一些神秘的 SQLServer 知识,我可能不必比我已经知道如何更容易地处理这个问题。 【参考方案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 会产生结果并重构受此问题影响的旧版本。

【讨论】:

以上是关于在另一个存储过程中调用时抑制存储过程输出?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 获取在另一个中调用的一个存储过程的输出

如何在另一个存储过程中调用一个存储过程(PHP 和 mysqli)

在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果

在oracle中 存储过程如何调用存储过程?

如何在另一个插入存储过程期间调用一个插入存储过程并获取其返回的ID?

如何在数组中获取存储过程的输出值