SQL Server Cursor 游标简介

游标用于遍历一个结果集合,在存储过程、自定义函数中要遍历某个中间结果集时非常有效。

语法

游标具体创建的语法这里不作具体说明,后面的例子中可见。但对游标使用中几个关键字进行简单说明。

  • DECLARE: 用于定义一个T-SQL的游标;
  • OPEN: 打开已定义的游标;
  • FETCH: 从游标指向的结果集中返回一行;
  • CLOSE: 关闭游标;
  • DEALLOCATE:释放游标资源;

基本上,游标的使用中,上述5个关键字都需要用到。

权限

定义游标需要的权限默认为具有SELECT权限的视图、表和列的索引用户。

局限性&限制性

在具有聚簇的列存储索引的表上不允许使用游标或触发器。但如果是非聚簇的列存储索引不在此限制范围之内。

请注意,SQL Server游标在很多编程规范都不建议使用。其原因是其执行速度慢,所以如果需要对一个较大的结果集进行便利的话,不推荐使用。

例子

下面举一个简单的例子,在User表上定义一个游标,然后将Name打印出来。

--定义变量
declare @FNAME varchar(32);  

--定义游标
declare userCursor cursor for
    select NAME from Users
--打开游标
open userCursor

--取游标中的一条数据到变量
fetch next from userCursor into @FNAME

--判断游标的状态
--  0  fetch语句成功
-- -1  fetch语句失败或此行不在结果集中
-- -2  被提取的行不存在
while(@@FETCH_STATUS=0)
begin
    --打印结果
    print @FNAME;
        
fetch next from userCursor into @FNAME;
end

--关闭游标
close userCursor
--销毁游标
deallocate userCursor

可以将上述代码段放入SSMS或者放入存储过程中执行即可。

参考文档

MSDN

Why not use cursor

标签: sql server, cursor, 游标

添加新评论