SQL2008游标

最近让写一个自动生成数据的存储过程,其中会遍历表中数据并做出相应处理,因为数据量不算太大所以使用到了游标,初识游标遇到几个小问题,所以来和大家一起分享一下:

使用游标的五个步骤:

1.声明游标  语法:(declare 游标名 Cursor select 语句(注:此处一定是select语句))

2.打开游标  语法:(open 游标名)

3.读取游标数据  语法:(Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  from 游标名 into @name1,@name2...
                      WHILE(@@FETCH_STATUS = 0)
                             BEGIN
                             --要执行的SQL语句
                             FETCH NEXT FROM 游标名 into @name1,@name2...
                             END

             )

 4.关闭游标  语法:(close 游标名)

5.释放游标   语法:(Deallocate 游标名)

首先来看带事务处理的完整游标例子:

begin transaction    --启动事务
begin
    --声明查询语句中要查询的列名
    declare @name varchar(50)
    declare @color bigint
    declare @id int
    
    --声明游标
    declare myCursor Cursor for
    SELECT name,color,id from Color
    open myCursor 
    fetch next from myCursor into @name,@color,@id        --这句话不能少,这表示将游标下移到数据行中,如果没有就不会进入读取数据
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        --打印出每行数据
        print('name='+@name+'; color='+Convert(varchar,@color)+'; id='+Convert(varchar,@id))    --这里使用Convert是为了将int类型和bigint类型转换成varchar类型进行打印,不然会报错
        --将游标下移
        FETCH NEXT FROM myCursor into @name,@color,@id
    END
    --关闭游标
    CLOSE myCursor 
    --释放游标
    DEALLOCATE myCursor 
    
    --处理事务
    if @@error>0 
    begin
        rollback transaction    --出错了进行回滚事务
        raiserror('出错了',16,1)
        return
    end
    else
    begin
    commit transaction    --正常运行提交事务
    end
end

 

错误一:这个问题造成的原因是  你SELECT name,color,id from Color 语句 中 的列名 和 fetch next from myCursor into @name,@color,@id 的数目不匹配导致的。

解决办法是:你查询了多少个字段,就声明多少个变量来接收(注:声明时的类型和数据库中字段的类型必须一致, 可以使用:select * from Color,但是,接收的变量必须和表中的字段个数必须一致)

错误二:,这个问题造成的原因可能是 1:你的查询语句本身有问题,2:你声明游标时少了一个关键字for 如代码所示:declare myCursor Cursor for

解决办法是:1:单独运行一下查询语句,2:将for关键字加上

注:第一个问题可能是大多数刚接触游标的人普遍会遇到的问题,顺便提一下  如何判断游标是否已经到最后一行:使用 @@Fetch_Status 全局变量来判断,如果是最后一行,这个变量的值为-1

      if(@@Fetch_Status=-1)    --若状态返回为-1表示已经到最后一行了,那么执行新增
                begin
                print('已经是最后一行了')
                end

友情推荐:http://www.cnblogs.com/youngberry/archive/2009/07/17/1525647.html

 

posted @ 2014-04-08 10:46  李信华  阅读(503)  评论(0编辑  收藏  举报