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

问题描述 投票:2回答:1

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

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

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

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

这些方法都不容易作为以下对象重用:

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

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

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

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

c# sql-server sqlclient
1个回答
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中。

© www.soinside.com 2019 - 2024. All rights reserved.