使用游标可以让一些复杂的处理变得简单,有时候就像在程序中书写While循环一样;但是不可否认的是游标在很多情况下都是低效的,耗用内存,锁住记录,逐行处理对大数据量简直就是灾难。
什么时候使用游标?这里有一些浅薄的认识:
1、数据处理的逻辑很复杂,使用单条SQL语句很难解决。
比如要根据多表查询的结果进行运算,然后更新某些个不在同一个表的字段的值,或者在不同的表中插入新的记录。
2、无法或没必要在应用程序中处理这些数据。
比如因数据结构升级,需要根据一些条件和查询结果重新计算某些列的值,写个程序有些兴师动众。
又或者只接触过数据库,对开发语言一窍不通。
3、数据量不是很大或者执行需要的时间在可以接受的范围内。
比如只是几千条数据的更新处理,或者允许处理时间在2个小时。
4、需要并发控制,内存足够大。
比如在程序中更新数据时,可能别的程序也会来处理数据,可能出来的结果就不是想要的,采用游标则可以将记录锁住,控制数据更新。
这几点在应用时需要相互考量权衡,选择适合自己的才是最好的。
下边再给出一个使用游标的例子,没做过的可以参考下(此例子不一定适合采用游标):
有两个表:报名表、报名人表,从报名人表中读取姓名,填到报名表的的RealNames中。
Declare @VID int --变量:报名编号 Declare @RealName nvarchar(50) --变量:某个报名人姓名 Declare @AllName nvarchar(200) --变量:某次报名人的全部姓名 --定义一个游标:读取报名人姓名为空的报名记录 Declare Cur Cursor For select VID from SignUp where ALLName='' Open Cur Fetch next From Cur Into @VID --从Cur中获取一条记录并赋值给变量 @VID While @@fetch_status=0 Begin set @AllName= '' --定义一个游标:读取指定报名编号的报名人记录 Declare Cur2 Cursor For select RealName from SignUpPerson where VID=@VID Open Cur2 Fetch next From Cur2 Into @RealName --从Cur2中获取一条记录并赋值给@RealName While @@fetch_status=0 --判断从Cur2中是否获取到数据 Begin set @AllName=@AllName+@RealName + ',' --将多个报名人姓名连接起来 Fetch Next From Cur2 Into @RealName --获取Cur2中下一条数据 End Close Cur2 Deallocate Cur2 Update SignUp Set AllName = @AllName where VID = @VID Fetch Next From Cur Into @VID End Close Cur Deallocate Cur
关键字: 游标
谢谢楼主,学习啦
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论