在另一个存储过程中调用时是否抑制存储过程输出?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在另一个存储过程中调用时是否抑制存储过程输出?相关的知识,希望对你有一定的参考价值。
所以我有sproc1
会做一些事情并返回一些行。重要的是它做了一些事情。我也有sproc2
做一些事情,调用sproc1
(这是它自己的事情)并返回它自己的行。问题是当我调用sproc2
时得到2个结果集。首先来自sproc1
,其次来自sproc2
。
在sproc1
中调用时是否可以轻松抑制sproc2
?
据我所知,我有两种方法可以做到这一点:
- 使用临时表捕获
exec sproc
的输出。 - 在
C#
中导航到最后一个结果集,并在忽略第一个结果集的同时使用它。
这些方法都不容易作为以下对象重用:
- first要求我
CREATE
一个与存储过程的输出匹配的临时表 - [second需要我遍历结果集以到达最后一个而不知道哪个是最后一个,除非我尝试移至下一个并通过
.NextResult()
失败。
最简单的方法是,如果SQL Server允许我在另一个存储过程中执行一个存储过程,但禁止内部执行它的输出。或者,如果SqlCommand
允许ExecuteReader(CommandBehavior.LastResult)
并自行导航到最后一个结果。
可以通过简单且可重用的方式实现两者中的任何一个吗?
真正的解决方案是将内部存储过程重构为write
和read
组件。或在内部存储过程中添加@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;
或某些特殊的语法,例如
或可以使用任何插入列格式并将其丢弃的通用NULL表。sexec
(如在受抑制的exec中]
[从现在开始,我可能会将此参数添加到我的所有产生结果并重构受此问题影响的旧参数的sprocs
中。
以上是关于在另一个存储过程中调用时是否抑制存储过程输出?的主要内容,如果未能解决你的问题,请参考以下文章
如何在另一个存储过程中调用一个存储过程(PHP 和 mysqli)