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

时间:2019-11-13 08:50:17

标签: c# sql-server sqlclient

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

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

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

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

这些方法都不容易以下列方式重复使用:

  • 第一要求我CREATE一个临时表,该临时表与存储过程的输出相匹配
  • 第二需要我遍历结果集,直到不知道哪个是最后一个,除非我尝试移至下一个并通过.NextResult()失败,否则返回最后一个。 / li>

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

能否以简单且可重复使用的方式实现这两者中的任何一个?

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

1 个答案:

答案 0 :(得分:0)

所以(目前为止,除非我找到一个更好的答案或有所改善)我最终为该参数添加了默认值,因此我不必在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上。