注册 登录
编程论坛 SQL Server论坛

关于游标!求助!!!

河屋一鸥 发布于 2013-01-28 09:43, 543 次点击
declare  @stmt  varchar(1024);
set @stmt ='declare hz_cur  cursor local for select col1,col2,col3 from tablename  where col1>1';
exec  (@stmt);
open hz_cur;
fetch  hz_cur  into @.........
while @@fetch_status=0
begin
..
..
    fetch hz_cur into @.......
end
close  hz_cur;
deallocate hz_cur;
报错:游标hz_cur不存在!!!
ps:把local去掉就不报错了。

问题:1/global的游标用起来有什么隐患
      2/上面那种写法怎样写才对。(不要直接declare hz_cur ....,因为我的select 语句有动态的where条件)
      
4 回复
#2
河屋一鸥2013-01-28 09:51
给自己顶一下,线上等。
#3
lxqlyld2013-01-31 10:07
local将游标的作用域设置为局部,如果游标创建在批处理、存储过程或触发器中,则该游标仅在这个局部范围内有效。global将游标的作用域设置为全局,这样在由连接执行的任何存储过程或批处理中都可以引用该游标。

如果 LOCAL和 GLOBAL 都没有指定,则数据库选项default to local cursor 控制由 DECLARE CURSOR 语句使用的默认值。如果 default to local cursor 为 true,Transact-SQL 游标默认为是局部的。如果此选项为 false,Transact-SQL 游标默认为是全局游标。在 SQL Server 2000版中,default to local cursors 选项默认为 FALSE,以便与 SQL Server 早期版本中的内容匹配。

具体你上面的写法怎么写才对,我也不太清楚,可能你的游标设置为局部的了,所以才不存在吧
#4
青春无限2013-02-04 19:25
帮顶
#5
NB20022013-02-05 10:49
只有本站会员才能查看附件,请 登录
LOCAL和GLOBAL二选一
 
     LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见,而GLOBAL意味着游标对于特定连接作为上下文,全局内有效,例如:
 
     

     如果不指定游标作用域,默认作用域为GLOBAL
1