Transact-SQL 游标

一,游标的 作用:

    当在存储过程,函数,批处理,触发器中 使用 
select  返回多条记录时,游标提供了一个可以对记录进行逐条处理的 方法.

二,游标的使用方法:

1 ,使用Declare Cursor语句,根据Select语句创建游标.

    有两种操作方法,效果是一样的,请注意他们的区别 :
          第一种:声明变量,然后设置游标
             
Declare   @MyVariable   Cursor                  -- 声明@MyVariable 这个变量

             
Set   @MyVariable   = Cursor   For                  -- 根据select创建游标的固定用法
              SELECT  id,name  FROM  usertable      

           第二种:声明变量,声明游标,设置变更为游标
                 
DECLARE   @MyVariable   CURSOR        -- 声明@MyVariable 这个变量

                 
DECLARE  MyCursor  CURSOR   FOR    -- 注意这里的MyCursor前没有@符号,声明了一个游标
                 SELECT  id,name  FROM  usertable

                
SET   @MyVariable   =  MyCursor           -- 在这里才把游标赋值给变量@MyVariable

2 ,使用Open语句填充该游标

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

3 ,使用Fetch语句更改游标所指向的记录,并将值存储在局部变量中:

    
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语句读取第一条记录

4 ,对检索出来的信息进行处理

  
While  ( @@FETCH_STATUS = 0 )
    
Begin
       
if   @chvName = ' 不必完美 '
          
begin
              
update  usetable  set  name = ' 管理员 '    where  id = @intID
          
end
          
Fetch   Next   From   @MyVariable    -- 移动到下一条,你可以反复使用这个语句
           Into   @intID , @chvName
    
End

    说明:
@@FETCH_STATUS是一个全局变量 ,
            它返回在当前连接期间执行的最后一条Fetch语句的执行状态.
            它经常循环中 用于退出循环的条件.

           
@@FETCH_STATUS的值和其含义
             
0 (数字零),提取完全成功;
             
- 1 , 最后一条已经读完或读取失败
             
- 2 ,记录丢失(例如,其他人删除了该记录)

    还有一个可能会用到的全局变量
@@cursor_rows   游标中的记录数

5 ,使用Close语句关闭该游标,释放大部分的资源(释放记录集以及锁)

       
Close   @MyVariable

       说明:此语句执行对象必须是一个已经打开的游标,否则将报错.

6 ,使用Deallocate语句清楚该游标.

    
Deallocate   @MyVariable

    说明:Close语句执行之后,游标结构仍然存在,你还可以再次打开它,如果彻底不用了.你应该用Dealocate语句删除该结构.

完成后的实例为:

            
Declare   @intID   int , @chvName   varchar ( 50 )

             
Declare   @MyVariable   Cursor                  -- 声明@MyVariable 这个变量

             
Set   @MyVariable   = Cursor   For                  -- 根据select创建游标的固定用法
              SELECT  id,name  FROM  usertable   

            
Open   @MyVariable          -- 使用之前必须先打开它

            
Fetch   Next   From   @MyVariable
            
Into   @intID , @chvName

  
While  ( @@FETCH_STATUS = 0 )
    
Begin
       
if   @chvName = ' 不必完美 '
          
begin
              
update  usetable  set  name = ' 管理员 '    where  id = @intID
          
end
          
Fetch   Next   From   @MyVariable    -- 移动到下一条,你可以反复使用这个语句
           Into   @intID , @chvName
    
End

Close   @MyVariable

Deallocate   @MyVariable  

本文部分内容引自:
< SQL Server 2000存储过程与XML编程 > 106 - 111页

你可能感兴趣的:(t-sql)