Transact-SQL 游标

None.gif
None.gif 一,游标的 作用:
None.gif
None.gif    当在存储过程,函数,批处理,触发器中 使用 
select  返回多条记录时,游标提供了一个可以对记录进行逐条处理的 方法.
None.gif
None.gif二,游标的使用方法:
None.gif
None.gif
1 ,使用Declare Cursor语句,根据Select语句创建游标.
None.gif
None.gif    有两种操作方法,效果是一样的,请注意他们的区别 :
None.gif          第一种:声明变量,然后设置游标
None.gif             
Declare   @MyVariable   Cursor                  -- 声明@MyVariable 这个变量
None.gif

None.gif             
Set   @MyVariable   = Cursor   For                  -- 根据select创建游标的固定用法
None.gif
              SELECT  id,name  FROM  usertable      
None.gif
None.gif           第二种:声明变量,声明游标,设置变更为游标
None.gif                 
DECLARE   @MyVariable   CURSOR        -- 声明@MyVariable 这个变量
None.gif

None.gif                 
DECLARE  MyCursor  CURSOR   FOR    -- 注意这里的MyCursor前没有@符号,声明了一个游标
None.gif
                 SELECT  id,name  FROM  usertable
None.gif
None.gif                
SET   @MyVariable   =  MyCursor           -- 在这里才把游标赋值给变量@MyVariable
None.gif

None.gif
2 ,使用Open语句填充该游标
None.gif
None.gif        
Open   @MyVariable          -- 使用之前必须先打开它
None.gif
                                                -- open语句会执行Declare Cursor语句中指定的Select语句,并填充游标
None.gif

None.gif
3 ,使用Fetch语句更改游标所指向的记录,并将值存储在局部变量中:
None.gif
None.gif    
Fetch   Next   From   @MyVariable
None.gif    
Into   @intID , @chvName
None.gif    
None.gif    说明: 此语句的语法是 
Fetch  操作符  From  游标变量名  Into  变量名
None.gif       
None.gif     a)操作符可以是: 
Next (下一条),Prior(前一条),First(第一条),Last(最后一条),
None.gif        也可以指定绝对位置和相对位置
None.gif    b)游标变量名就是之前创建并填充的
@MyVariable
None.gif    c)变量名:需要在使用之前声明,本例 用到的
@intID , @chvName
None.gif        在Declare 
@MyVariable  Cursor之前声明Declare  @intID   int , @chvName   varchar ( 50 )
None.gif    d)游标刚好打开时 
Fetch  Next语句读取第一条记录
None.gif
None.gif
4 ,对检索出来的信息进行处理
None.gif
None.gif  
While  ( @@FETCH_STATUS = 0 )
None.gif    
Begin
None.gif       
if   @chvName = ' 不必完美 '
None.gif          
begin
None.gif              
update  usetable  set  name = ' 管理员 '    where  id = @intID
None.gif          
end
None.gif          
Fetch   Next   From   @MyVariable    -- 移动到下一条,你可以反复使用这个语句
None.gif
           Into   @intID , @chvName
None.gif    
End
None.gif
None.gif    说明:
@@FETCH_STATUS是一个全局变量 ,
None.gif            它返回在当前连接期间执行的最后一条Fetch语句的执行状态.
None.gif            它经常循环中 用于退出循环的条件.
None.gif
None.gif           
@@FETCH_STATUS的值和其含义
None.gif             
0 (数字零),提取完全成功;
None.gif             
- 1 , 最后一条已经读完或读取失败
None.gif             
- 2 ,记录丢失(例如,其他人删除了该记录)
None.gif
None.gif    还有一个可能会用到的全局变量
@@cursor_rows   游标中的记录数
None.gif
None.gif
5 ,使用Close语句关闭该游标,释放大部分的资源(释放记录集以及锁)
None.gif
None.gif       
Close   @MyVariable
None.gif
None.gif       说明:此语句执行对象必须是一个已经打开的游标,否则将报错.
None.gif
None.gif
6 ,使用Deallocate语句清楚该游标.
None.gif
None.gif    
Deallocate   @MyVariable
None.gif
None.gif    说明:Close语句执行之后,游标结构仍然存在,你还可以再次打开它,如果彻底不用了.你应该用Dealocate语句删除该结构.
None.gif
None.gif完成后的实例为:
None.gif
None.gif            
Declare   @intID   int , @chvName   varchar ( 50 )
None.gif
None.gif             
Declare   @MyVariable   Cursor                  -- 声明@MyVariable 这个变量
None.gif

None.gif             
Set   @MyVariable   = Cursor   For                  -- 根据select创建游标的固定用法
None.gif
              SELECT  id,name  FROM  usertable   
None.gif
None.gif            
Open   @MyVariable          -- 使用之前必须先打开它
None.gif

None.gif            
Fetch   Next   From   @MyVariable
None.gif            
Into   @intID , @chvName
None.gif
None.gif  
While  ( @@FETCH_STATUS = 0 )
None.gif    
Begin
None.gif       
if   @chvName = ' 不必完美 '
None.gif          
begin
None.gif              
update  usetable  set  name = ' 管理员 '    where  id = @intID
None.gif          
end
None.gif          
Fetch   Next   From   @MyVariable    -- 移动到下一条,你可以反复使用这个语句
None.gif
           Into   @intID , @chvName
None.gif    
End
None.gif
None.gif
Close   @MyVariable
None.gif
None.gif
Deallocate   @MyVariable  
None.gif
None.gif本文部分内容引自:
< SQL Server 2000存储过程与XML编程 > 106 - 111页
None.gif

转载于:https://www.cnblogs.com/jhobo/archive/2007/01/08/614781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值