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

使用游标的五个步骤:

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

SQL2008游标的更多相关文章

  1. sql2008游标FORWARD_ONLY STATIC 的使用方式

    CREATE TABLE #xms_staff_department ( id int, name varchar(128), parent_id int, parent_path varchar(5 ...

  2. SQL2008触发器

    最近第一次接触触发器,感觉很是新奇,也很是蛋疼,因为老板要求的是在触发器中获取用户信息,并把对表的操作进行记录,后者实现到时比较简单,前者确实让我纠结了好久,其实百度了一下关于SQL2008触发器的文 ...

  3. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

  4. 用游标实现查询当前服务器所有数据库所有表的SQL

    declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...

  5. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  6. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  7. SQL Server 游标运用:鼠标轨迹字符串分割

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...

  8. 读书笔记--SQL必知必会21--使用游标

    21.1 游标 结果集(result set),SQL查询说检出的结果. 游标(cusror),是一个存储在DBMS服务器上的数据库查询. 游标不是一条SELECT语句,而是被该句检索出来的结果集. ...

  9. sqlserver 游标的使用

    declare @temp_temp uniqueidentifier--临时变量 DECLARE aaa CURSOR for select Id from A ------------------ ...

随机推荐

  1. PNG格式的图像文件,创建的图像的MIME类型的头部

    在安装完这三个组件后,还需要重新配置一次PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一.运行make clean,然后在当前的配置中添加下面的内容: --with-gd=[/path/t ...

  2. pod 新格式

    执行 $pod install 的时候,报一下错误: Analyzing dependencies [!] The dependency `MJExtension` is not used in an ...

  3. Amoeba For MySQL读写分离

    Amoeba安装,参考http://hi.baidu.com/itfenqing/item/79fe989838e1e8ad83d2959c Amoeba版本为:amoeba-mysql-1.3.1- ...

  4. linux 查找命令

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print

  5. tomcat session cluster

    Session的生命周期 以前在学习的时候没怎么注意,今天又回过头来仔细研究研究了一下Session的生命周期. Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessi ...

  6. WPF部署问题 解决:The application requires that the assembly...be installed in the GAC

    vs-->引用-->找到问题类库-->邮件属性--->特定版本-->false done

  7. vim - multiple windows

    https://www.cs.oberlin.edu/~kuperman/help/vim/windows.html

  8. 必须使用"角色管理工具"安装或配置microsoft.net framework 3.5

    windows 2008 R2 安装.net framework 3.5报错 : 解决方法: (1)打开服务器管理器 (2)右击左侧功能——>添加功能 (3)向导中勾选.NET Framewor ...

  9. Cursor use

    Ref:http://www.cnblogs.com/Gavinzhao/archive/2010/07/14/1777644.html declare @Id varchar(100),@name ...

  10. 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流

    最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...