波斯马BOSSMA Information Technology

SQL Server使用游标的一点思考

发布时间:2014年4月15日 / 分类:DataBase / 8,753 次浏览 / 评论

使用游标可以让一些复杂的处理变得简单,有时候就像在程序中书写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
本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《SQL Server使用游标的一点思考

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

目前有1 条评论

  1. jianjunzhangaaa 0楼:

    谢谢楼主,学习啦

发表评论