游标cursor 与循环fetch
本文部分非原创
使用示例:
declare myCursor cursor
for
select ID,[Column1],[Num] from Table1
open myCursor;
declare @ID int,@Column1 varchar(50),@Num int
fetch next from myCursor into @ID ,@Column1 ,@Num;
while @@FETCH_STATUS = 0
begin
--do something
fetch next from myCursor into @ID ,@Column1 ,@Num;
end
close myCursor
deallocate myCursor
由select语句查来的记录称为结果集。
在一些应用程序中不能将结果集作为一个处理单元来处理,
它就需要一种处理机来分批处理,这时就需要游标来控制。
1.声明游标:
它主要用来存储过程,触发器和语句中,对结果集逐行处理。
语法:declare 游标名称 insensitive scroll cursor
for select 语句
for [(read only ) / update of [字段名……]]
注意:当用{update of}指定可更新的字段时,指定所引用的
游标名用{where current of游标名};当使用{read only}时,
游标中的数据为只读。
例:declare AA_cursor cursor for select * from AA
where 地址='褡裢'
for update of 姓名,电话
open AA_cursor
fetch next from AA_cursor
update AA set 姓名='流弹' where current of AA_cursor
close AA_cursor
deallocate AA_cursor
2.打开已声明的游标:
使用 open 打开.
语法:open 游标名称
注意: 打开后可以使用来判断打开操作是否成功,如果为0,
则打开成功,打开后使用无参函数来获取游标,
当前存在的记录数,共有四种取值:
n: 该Cursor所定义的数据已完全从表中读人,
n为全部的数据行。
-m: 该Cursor所定义的数据未完全从表中读人,
m为目前Cursor数据子集内的数据行。
0:无符合条件的数据或该Cursor已被关闭或释放。
-1:该游标为动态的,数据行经常变动无法确定。
例: declare AA_cursor cursor keyset for select * from AA
open AA_cursor
if @@error=0
begin
print'游标打开成功'
if @@cursor_rows>0
print '游标结果集内记录数为:'+convert(varchar(3),@@cursor_rows)
end
close AA_cursor
deallocate AA_cursor
注意: 指定当游标打开时,游标中行的成员资格和顺序已经固定。
对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset
的表中。对基表中的非键值所做的更改(由游标所有者更改或
由其它用户提交)在用户滚动游标时是可视的。其他用户进行
的插入是不可视的(不能通过 Transact-SQL 服务器游标进行
插入)。如果某行已删除,则对该行的提取操作将返回
@@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后
接着插入新行的操作。含有新值的行不可视,对含有旧值的行
的提取操作将返回@@FETCH_STATUS 值 -2。如果通过指定
WHERE CURRENT OF子句用游标完成更新,则新值可视。
3.从游标中提取数据:
声明一个游标后,并打开成功,就可以使用 Fetch 来从游标中提取数据。
语法: fetch (first / last / prior /next /
absolute[n/@nvar] / relative[n/@nvar])
from 游标名称 [into] 数量名 [……n]