关于set nocount on的作用域问题!请教

yoan_T 2011-05-27 11:08:53
当存储过程开始时,我设置为set nocount on
1.如果我在这个存储过程中调用其他存储过程,在这个被调用的存储过程中未设置为on,此时被调用的存储过程将采用on还是off的状态执行?
2.如果当中有语句会触发到表的触发器的执行,那么该触发器的执行又是采用on还是off的状态执行?

create procedure up123
(@num bigint)
as
begin
set nocount on

exec up2 --执行被调用存储过程 , 是on ,还是 off?
update t1 set num = @num where num<>@num -- 若触发了t1的触发器,那么触发器的内容是on , 还是off的状态执行?
set nocount off
end
...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoan_T 2011-05-27
  • 打赏
  • 举报
回复
刚测试过,当中两处都是为on状态下执行, 谢谢大家
billpu 2011-05-27
  • 打赏
  • 举报
回复
我刚刚测试了一下 好像还有点复杂

如果你的up2存储过程或者触发器里面没有显示的指定set nocount off的话 那就是最外层决定的

如果你的up2存储过程或者触发器里有显示指定set nocount off的话,那输出就是off的

所以我认为结论是 谁输出的就先看这个输出的过程的状态,如果输出的没指定就看上一层直到最外层
--小F-- 2011-05-27
  • 打赏
  • 举报
回复
在本次会话之内
yoan_T 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fanzhouqi 的回复:]
作用域 就在存储过程内
[/Quote]
那意思是,被调用的存储过程和触发器都是以off状态执行的吗?
fanzhouqi 2011-05-27
  • 打赏
  • 举报
回复
作用域 就在存储过程内
billpu 2011-05-27
  • 打赏
  • 举报
回复
我认为就你这个例子是 off的
billpu 2011-05-27
  • 打赏
  • 举报
回复
取决于最外层存储过程
打一壶酱油 2011-05-27
  • 打赏
  • 举报
回复
set nocount 作用域为当前会话,也就是说只要会话没有关闭 nocount 设置就一直有效。
存储过程可以看成运行在会话中的一个批(batch),在过程中设置的 nocount 在过程执行后是不会自动还原为原来的值。也就是说,在过程中 set nocount on,过程执行完毕后会话仍然是 set nocount on。
SQL code
-- 关闭会话的 nocount
set nocount off;
create procedure #p
as
set nocount on;
go
-- 执行过程
exec #p;
-- 验证会话的 nocount
dbcc useroptions;
/*
nocount SET
*/
叶子 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 billpu 的回复:]

我刚刚测试了一下 好像还有点复杂

如果你的up2存储过程或者触发器里面没有显示的指定set nocount off的话 那就是最外层决定的

如果你的up2存储过程或者触发器里有显示指定set nocount off的话,那输出就是off的

所以我认为结论是 谁输出的就先看这个输出的过程的状态,如果输出的没指定就看上一层直到最外层
[/Quote]
+1

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧