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 游标名)
首先来看带事务处理的完整游标例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 |
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。