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