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

标签 c# sql-server sqlclient

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

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

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

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

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

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

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

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

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

最佳答案

所以(现在,除非我找到更好的答案或有什么改进)我最终添加了这个参数和默认值,所以我根本不必在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 表。

我可能会从现在开始将此参数添加到我所有产生结果的存储过程,并重构受此问题影响的旧存储过程。

关于c# - 在另一个存储过程中调用时抑制存储过程输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58833323/

相关文章:

c# - .Net Windows 服务抛出 EventType clr20r3 system.data.sqlclient.sql 错误

c# - 每个 parent 只选择 1 个 child

c# - 两个问号一起表示在 C# 中只接受 null 而不是空白 为什么?

c# - UWP 与 ITextRange 接口(interface)的使用。 WPF 中的 TextRange 对象

sql - 使用映射表动态更改列名

SQL server 2012 SP_HELPTEXT 额外行问题

sql - T-SQL插入触发器在多个表上根据if条件插入、更新

c# - 当其他数据绑定(bind)有效时,命令绑定(bind)不起作用

c# - 如何在 ASP.NET Core 中使用 SqlClient?

python - SqlClient 连接超时