sql server 游标集合不随着游标里变量的改变而改变,求解,求大神!

weixin_39241357 2018-05-02 09:41:13
测试代码如下:
测试表:
create table tb_sptest(
cl1 int primary key,
cl2 varchar(10)
)

insert tb_sptest values(1,'小明')

insert tb_sptest values(2,'小红')

insert tb_sptest values(3,'小芳')
测试存储过程代码:
create PROCEDURE [dbo].[SP_test]
as
begin
declare @flag int

declare @cl1 int
declare @cl2 varchar(10)

declare crVWLS CURSOR LOCAL for
select cl1, cl2
from tb_sptest where cl1 > @flag

--对@flag赋值
set @flag =2 --赋值不对过程起作用

--打开游标
open crVWLS;
FETCH NEXT FROM crVWLS INTO @cl1,@cl2
while @@FETCH_STATUS = 0
begin
update tb_sptest set cl2 = 'SUCESS' where cl1 = @cl1 and cl2 = @cl2
FETCH NEXT FROM crVWLS INTO @cl1,@cl2
end
CLOSE crVWLS;
DEALLOCATE crVWLS;


end

结果:
cl1 为3 的小芳应该变为 SUCESS,但没变,经查看游标未取到那个值,即变量 @flag 赋值未影响到游标变量,怎么解?求大神

...全文
340 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
David.X.Wu 2019-08-05
  • 打赏
  • 举报
回复
引用 8 楼 weixin_39241357 的回复:
哦,刚才网上找了好久,使用动态游标,谢谢各位了! 这是网上的代码: DECLARE @sql nvarchar(1000) SET @sql='SELECT * FROM tableName ' DECLARE cur CURSOR FOR EXECUTE sp_executesql @sql OPEN cur FETCH NEXT FROM cur WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cur END CLOSE cur DEALLOCATE cur
这句好像有语法错误呢, DECLARE cur CURSOR FOR EXECUTE sp_executesql @sql
weixin_39241357 2018-05-02
  • 打赏
  • 举报
回复
哦,刚才网上找了好久,使用动态游标,谢谢各位了! 这是网上的代码: DECLARE @sql nvarchar(1000) SET @sql='SELECT * FROM tableName ' DECLARE cur CURSOR FOR EXECUTE sp_executesql @sql OPEN cur FETCH NEXT FROM cur WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cur END CLOSE cur DEALLOCATE cur
卖水果的net 版主 2018-05-02
  • 打赏
  • 举报
回复
引用 3 楼 weixin_39241357 的回复:
就是要在过程中随时变化的,不放在上面,有别的办法,传递回游标吗?
需要把游标关了,再重新打开。 或者 定义一个新游标,两层.
二月十六 版主 2018-05-02
  • 打赏
  • 举报
回复
引用 5 楼 weixin_39241357 的回复:
我是想通过改变变量,多次重复使用游标,那怎么解呢,大神?
游标嵌套游标 另外楼主可以说说需求,看看有没有游标之外的方法,游标效率不是很高
weixin_39241357 2018-05-02
  • 打赏
  • 举报
回复
我是想通过改变变量,多次重复使用游标,那怎么解呢,大神?
二月十六 版主 2018-05-02
  • 打赏
  • 举报
回复
引用 3 楼 weixin_39241357 的回复:
就是要在过程中随时变化的,不放在上面,有别的办法,传递回游标吗?
declare crVWLS CURSOR LOCAL for
select cl1, cl2
from tb_sptest where cl1 > @flag
这里已经把读取到的数据固定了,所以读取的数据不会变了
weixin_39241357 2018-05-02
  • 打赏
  • 举报
回复
就是要在过程中随时变化的,不放在上面,有别的办法,传递回游标吗?
二月十六 版主 2018-05-02
  • 打赏
  • 举报
回复
二月十六 版主 2018-05-02
  • 打赏
  • 举报
回复
把赋值语句放到读取语句的上边
alter PROCEDURE [dbo].[SP_test]
as
begin
declare @flag int
--对@flag赋值
set @flag =2 --赋值不对过程起作用
declare @cl1 int
declare @cl2 varchar(10)

declare crVWLS CURSOR LOCAL for
select cl1, cl2
from tb_sptest where cl1 > @flag



--打开游标
open crVWLS;
FETCH NEXT FROM crVWLS INTO @cl1,@cl2
while @@FETCH_STATUS = 0
begin
update  tb_sptest set cl2 = 'SUCESS' where cl1 = @cl1 and cl2 = @cl2
FETCH NEXT FROM crVWLS INTO @cl1,@cl2
end	
CLOSE crVWLS;
DEALLOCATE crVWLS;	


end 


34,593

社区成员

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

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