如何防止存储过程返回中间记录集?

问题描述:

问题背景:我用2008年的VisualStudio和类型化数据集,它提供一种“轻松”获得executescalar() 执行标返回第一recorset最后一部分的第一行的第一个字段的值,而经常忽略如何防止存储过程返回中间记录集?

这种行为的问题是最经常要进行一些其他要求你计算值前与最终select @returnValue语句返回。

所以我的问题是,一般来说,如何防止SP返回中间记录集? (我试过SET FMTONLY ON/OFF,但有不必要的副作用行为)

另一个相关的问题是:你怎么阻止T-SQL UPDATE语句从返回更新的行?有时你使用更新来简单地更新...

谢谢!

样本:

BEGIN

SET NOCOUNT ON; 

declare @c int 
select @c=(select count(*) from work where ...) 
select @c -- so ExecuteScalar() works 
update sousblocs set myfield = @c 
     where ... 

select @c --after the update, won't be seen by ExecuteScalar() 
return @c --useless for ExecuteScalar 

END

这是我的问题,它可以与第一个 “选择@c” 来解决;但我不知道你是否可以禁用recorset输出....

+1

“你想提出一些其他请求” - 请向我们展示一些示例代码,以说明你在这里的意思 – AakashM 2010-12-10 14:13:50

+0

我的意思是,例如,你计算一个存储更新的值,而你想要返回该值。在这种情况下,更新将成为第一个要返回的记录集 – oldbrazil 2010-12-10 14:20:51

1 - 在没有目标的存储过程中没有多个select语句。即如果您运行SELECT 1,2,3,然后运行SELECT 4,5,6它将返回2个记录集。

2 - 我不确定为什么当您运行更新时将记录恢复。尝试设置SET NOCOUNT ON以关闭“受影响的xx行”消息。

+0

“SET NOCOUNT ON”已设置。返回的消息不是问题。像“select @ var = somefunc(...”)这样的语句不会返回记录集,如果你不需要记录集,那么在SELECTING中没有意义,这是正确的,但是更新语句是个问题......除非你考虑你更新一个已知的价值,你可以事先选择... – oldbrazil 2010-12-10 14:28:36

+1

@oldbrazil - 你准确回来了什么? – JNK 2010-12-10 14:29:51