T-SQL游标

 

游标(Cursor)是指向查询结果集的一个指针,它是一个通过定义语句和一条SELECT语句相关联的一组SQL语句。游标使用户可逐行访问SQL Server返回的结果集。

 

游标包含两方面的内容 :

(1)游标结果集:执行其中的SELECT语句返回的结果集。

(2)游标位置:一个指向游标结果集内的某一条记录的指针。

 

声明游标格式:

 

DECLARE 游标名称 [INSENSITIVE] [SCROLL] CURSOR  
[LOCAL][GLOBAL]  
FOR SELECT 语句  
[FOR {READ ONLY|UPDATE[OF 字段名[,.........N]]}]
 

 

其中INSENSITIVE选项说明,定义游标时系统将在tempdb数据库中创建一个临时表,存储该游标使用的数据

(1)LOCAL|GLOBAL:用于指定该游标的作用域是局部的还是全局的。

(2)SCROLL:所定义的游标的数据提取操作可以使用一下选项:

       ①FRIST:指出游标中的第一行数据。

       ②NEXT:读取游标中当前位置中的下一行数据。

       ③PRIOR:读取游标中当前位置中的上一行数据。

       ④LAST:读取游标中最后一行数据。

       ⑤RELATIVE(N):读取游标中当前位置之后的第n行数据。

       ⑥ABSOLUTE(N):读取游标中第n行数据。

(3)READ ONLY:当前所定义的游标为只读游标,禁止通过对该游标进行更新数据。

(4)UPDATE:可以通过游标修改基表中的数据。

 

【例】查询出所有女生的信息作为结果集,并为该结果集说明只读的游标。

 

 

DECLARE student_cursor CURSOR
FOR 
  SELECT * FROM dbo.student where ssex='女'
FOR READ ONLY
 

 

打开游标

打开游标声明格式:

 

OPEN 游标名称

 

当用OPEN语句打开了游标并在数据库中执行了查询后,不能立即利用在查询结果集中的数据,必须用FETCH语句来取数据,一条FETCH语句一次可以将一条记录放入程序员指定的变量中。

 

 

 

OPEN student_cursor
FETCH NEXT FROM student_cursor
WHILE @@fetch_status = 0
BEGIN 
  FETCH NEXT FROM student_cursor
END
 

 

游标函数

 

 

(1)@@CURSOR_ROWS

返回连接上最后打开的游标中当前存在的合格行的数量。为提高性能,Microsoft® SQL Server™ 可以异步填充大键集和静态游标。可调用 @@CURSOR_ROWS,以确定当它被调用时,符合游标的行的数目被进行了检索。

返回值

 

描述

 

-m

 

游标被异步填充。返回值 (-m) 是键集中当前的行数。

 

-1

 

游标为动态。因为动态游标可反映所有更改,所以符合游标的行数不断变化。因而永远不能确定地说所有符合条件的行均已检索到。

 

0

 

没有被打开的游标,没有符合最后打开的游标的行,或最后打开的游标已被关闭或被释放。

 

n

 

游标已完全填充。返回值 (n) 是在游标中的总行数。

 

 

 

(2)@@CURSOR_STATUS

这是一个标量函数,该函数允许存储过程的调用方确定针对一个给定参数,该过程是否返回游标和结果集。

语法

CURSOR_STATUS
    ( 
        { 'local' , 'cursor_name' }
        | { 'global' , 'cursor_name' }
        | { 'variable' , 'cursor_variable' } 
    )

参数

'local' 指定一个常量,该常量表明游标的源是一个本地游标名。

'cursor_name' 游标名。游标名必须符合标识符的规则。

'global' 指定一个常量,该常量表明游标的源是一个全局游标名。

'variable' 指定一个常量,该常量表明游标的源是一个本地变量。

'cursor_variable' 游标变量的名称。必须使用 cursor 数据类型定义游标变量。

返回类型 smallint

返回值

 


游标名

 


游标变量

 

1

 

游标的结果集至少有一行,并且:

 

对于不感知游标和键集游标,结果集至少有一行。

 

对于动态游标,结果集可以有零行、一行或多行。

 

分配给该变量的游标已经打开,并且:

 

对于不感知游标和键集游标,结果集至少有一行。

 

对于动态游标,结果集可以有零行、一行或多行。

 

0

 

游标的结果集为空。*

 

分配给该变量的游标已经打开,然而结果集肯定为空。*

 

-1

 

游标被关闭。

 

分配给该变量的游标被关闭。

 

-2

 

不可用。

 

可以是:

 

先前调用的过程并没有将游标指派给 OUTPUT 变量。

 

先前调用的过程给 OUTPUT 变量指派了游标,然而在过程结束时,游标处于关闭状态。因此,游标被释放,并且没有返回给调用过程。

 

没有将游标指派给已声明的游标变量。

 

-3

 

带有指定名称的游标不存在。

 

带有指定名称的游标变量并不存在,或者即使存在这样一个游标变量,但并没有给它分配游标。

 

 

 

 

(3)@@FETCH_STATUS

返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。

返回值

 

描述

 

0

 

FETCH 语句成功。

 

-1

 

FETCH 语句失败或此行不在结果集中。

 

-2

 

被提取的行不存在。

 

 

 

关闭游标

CLOSE 游标名称

 

释放游标

DELLOCATE 游标名称

关闭的游标机构本身也占有一定的计算机资源,如果确定某个游标不再使用,可及时的将该游标释放

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值