Posts Tagged ‘游标’

SQL使用游标对Select结果集循环操作

星期二, 七月 30th, 2013 76 views

首先先简述一下SQL中游标的作用,我们可以将游标理解成一个数组或是一个队列,其保存了Select的结果集的地址队列。
当我们需要对Select的结果集进行循环操作时,可以先定义一个游标,并将结果集指向到这个游标当中,使用游标像指针一样访问这个结果集,如下

①声明游标

1
2
3
DECLARE @id INT --声明一个变量id
DECLARE cur CURSOR read_only FOR --声明一个名为cur的游标
SELECT Userid FROM UserTable WHERE ...... --某Select语句

上述代码意为声明一个游标指向某Select语句的结果集,read_only的意思是这个指针只用于读取,如果更新则需要使用update,这样做的好处是可以明确游标的针对性从而提高执行效率。
DECLARE @id int 意为声明一个变量id,后续会用于从游标指向的结果集中获取数据

创建完游标之后,现在需要打开这个游标并进行操作,语法如下:

②打开游标并读取游标数据

1
2
3
4
5
6
7
8
OPEN cur
Fetch NEXT FROM cur INTO @id --将cur中的下一个数据赋值给变量id

WHILE(@@FETCH_STATUS = 0)
BEGIN
    --要执行的SQL语句
    fetch NEXT FROM cur INTO @id
END

Fetch 的语法如下
Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From 游标名 INTO @变量1,@变量2…

Next:返回结果集中当前行的下一行记录
Prior:返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。
First:返回结果集中的第一行记录,并且将其作为当前行。
Last:返回结果集中的最后一行,并且将其作为当前行。
Absolute n:当 n > 0 时返回从游标头开始的第n行,并且将其作为当前行;n < 0 时返回从游标末尾开始的第n行,并且将其作为当前行;n = 0 时返回当前行。
Relative n:当 n > 0 时返回从当前行之后的第n行;n < 0 时则返回当前行之前的第n行;n = 0 时返回当前行。

开启游标后,游标指针位于-1行,因此需要使用FETCH NEXT移动到Select的结果集的第一行,
WHILE(@@FETCH_STATUS = 0)循环判断是否有数据,满足条件时将执行Begin和End之间的语句。
每次执行完之后注意使用 Fetch NEXT 移动到下一行。
(更多…)