一,游标的 作用:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
当在存储过程,函数,批处理,触发器中 使用
select
返回多条记录时,游标提供了一个可以对记录进行逐条处理的 方法.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
二,游标的使用方法:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
1
,使用Declare Cursor语句,根据Select语句创建游标.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
有两种操作方法,效果是一样的,请注意他们的区别 :
第一种:声明变量,然后设置游标
Declare
@MyVariable
Cursor
--
声明@MyVariable 这个变量
Set
@MyVariable
=
Cursor
For
--
根据select创建游标的固定用法
SELECT
id,name
FROM
usertable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
第二种:声明变量,声明游标,设置变更为游标
DECLARE
@MyVariable
CURSOR
--
声明@MyVariable 这个变量
DECLARE
MyCursor
CURSOR
FOR
--
注意这里的MyCursor前没有@符号,声明了一个游标
SELECT
id,name
FROM
usertable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SET
@MyVariable
=
MyCursor
--
在这里才把游标赋值给变量@MyVariable
2
,使用Open语句填充该游标
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Open
@MyVariable
--
使用之前必须先打开它
--
open语句会执行Declare Cursor语句中指定的Select语句,并填充游标
3
,使用Fetch语句更改游标所指向的记录,并将值存储在局部变量中:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Fetch
Next
From
@MyVariable
Into
@intID
,
@chvName
说明: 此语句的语法是
Fetch
操作符
From
游标变量名
Into
变量名
a)操作符可以是:
Next
(下一条),Prior(前一条),First(第一条),Last(最后一条),
也可以指定绝对位置和相对位置
b)游标变量名就是之前创建并填充的
@MyVariable
c)变量名:需要在使用之前声明,本例 用到的
@intID
,
@chvName
在Declare
@MyVariable
Cursor之前声明Declare
@intID
int
,
@chvName
varchar
(
50
)
d)游标刚好打开时
Fetch
Next语句读取第一条记录
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
,对检索出来的信息进行处理
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
While
(
@@FETCH_STATUS
=
0
)
Begin
if
@chvName
=
'
不必完美
'
begin
update
usetable
set
name
=
'
管理员
'
where
id
=
@intID
end
Fetch
Next
From
@MyVariable
--
移动到下一条,你可以反复使用这个语句
Into
@intID
,
@chvName
End
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
说明:
@@FETCH_STATUS是一个全局变量
,
它返回在当前连接期间执行的最后一条Fetch语句的执行状态.
它经常循环中 用于退出循环的条件.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
@@FETCH_STATUS的值和其含义
:
0
(数字零),提取完全成功;
-
1
, 最后一条已经读完或读取失败
-
2
,记录丢失(例如,其他人删除了该记录)
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
还有一个可能会用到的全局变量
@@cursor_rows
游标中的记录数
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
,使用Close语句关闭该游标,释放大部分的资源(释放记录集以及锁)
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Close
@MyVariable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
说明:此语句执行对象必须是一个已经打开的游标,否则将报错.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
,使用Deallocate语句清楚该游标.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Deallocate
@MyVariable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
说明:Close语句执行之后,游标结构仍然存在,你还可以再次打开它,如果彻底不用了.你应该用Dealocate语句删除该结构.
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
完成后的实例为:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Declare
@intID
int
,
@chvName
varchar
(
50
)
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Declare
@MyVariable
Cursor
--
声明@MyVariable 这个变量
Set
@MyVariable
=
Cursor
For
--
根据select创建游标的固定用法
SELECT
id,name
FROM
usertable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Open
@MyVariable
--
使用之前必须先打开它
Fetch
Next
From
@MyVariable
Into
@intID
,
@chvName
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
While
(
@@FETCH_STATUS
=
0
)
Begin
if
@chvName
=
'
不必完美
'
begin
update
usetable
set
name
=
'
管理员
'
where
id
=
@intID
end
Fetch
Next
From
@MyVariable
--
移动到下一条,你可以反复使用这个语句
Into
@intID
,
@chvName
End
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Close
@MyVariable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Deallocate
@MyVariable
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
本文部分内容引自:
<
SQL Server 2000存储过程与XML编程
>
106
-
111页
转载于:https://www.cnblogs.com/jhobo/archive/2007/01/08/614781.html