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
SQL2008游标的更多相关文章
- sql2008游标FORWARD_ONLY STATIC 的使用方式
CREATE TABLE #xms_staff_department ( id int, name varchar(128), parent_id int, parent_path varchar(5 ...
- SQL2008触发器
最近第一次接触触发器,感觉很是新奇,也很是蛋疼,因为老板要求的是在触发器中获取用户信息,并把对表的操作进行记录,后者实现到时比较简单,前者确实让我纠结了好久,其实百度了一下关于SQL2008触发器的文 ...
- 在SQL2008查找某数据库中的列是否存在某个值
在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...
- 用游标实现查询当前服务器所有数据库所有表的SQL
declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...
- 使用rowid抽取数据方法以及大数据量游标卡住的应对
平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...
- Mysql - 游标/动态sql/事务
游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...
- SQL Server 游标运用:鼠标轨迹字符串分割
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...
- 读书笔记--SQL必知必会21--使用游标
21.1 游标 结果集(result set),SQL查询说检出的结果. 游标(cusror),是一个存储在DBMS服务器上的数据库查询. 游标不是一条SELECT语句,而是被该句检索出来的结果集. ...
- sqlserver 游标的使用
declare @temp_temp uniqueidentifier--临时变量 DECLARE aaa CURSOR for select Id from A ------------------ ...
随机推荐
- PNG格式的图像文件,创建的图像的MIME类型的头部
在安装完这三个组件后,还需要重新配置一次PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一.运行make clean,然后在当前的配置中添加下面的内容: --with-gd=[/path/t ...
- pod 新格式
执行 $pod install 的时候,报一下错误: Analyzing dependencies [!] The dependency `MJExtension` is not used in an ...
- Amoeba For MySQL读写分离
Amoeba安装,参考http://hi.baidu.com/itfenqing/item/79fe989838e1e8ad83d2959c Amoeba版本为:amoeba-mysql-1.3.1- ...
- linux 查找命令
查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print
- tomcat session cluster
Session的生命周期 以前在学习的时候没怎么注意,今天又回过头来仔细研究研究了一下Session的生命周期. Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessi ...
- WPF部署问题 解决:The application requires that the assembly...be installed in the GAC
vs-->引用-->找到问题类库-->邮件属性--->特定版本-->false done
- vim - multiple windows
https://www.cs.oberlin.edu/~kuperman/help/vim/windows.html
- 必须使用"角色管理工具"安装或配置microsoft.net framework 3.5
windows 2008 R2 安装.net framework 3.5报错 : 解决方法: (1)打开服务器管理器 (2)右击左侧功能——>添加功能 (3)向导中勾选.NET Framewor ...
- Cursor use
Ref:http://www.cnblogs.com/Gavinzhao/archive/2010/07/14/1777644.html declare @Id varchar(100),@name ...
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...