游标简介:
Sql游标提供了一种循环结果集的机制,它对数据集中的数据进行逐行读取,可以实现不易用select语句语法轻易地表达复杂计算。
通过sql语言从数据库中检索数据口,然后把结果放到内存的一块区域中.往往这个结果讲包含多条数据,这也是游标产生了一个不可避免的弊端对系统资源占用相对较大。
游标的使用过程:
1.声明游标
2.打开游标
3.从游标中重复(读取)行,有选择的修改或者删除
4.关闭游标
5.当不再需要游标时,释放游标
声明一个游标
DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR sql-statement
例:Declare Mycursor
For select * from tb_name
打开游标
OPEN MyCursor
游标的操作
FETCH
[ NEXT | PRIOR | FIRST | LAST]
FROM
{ 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
一. 可滚动游标
Next 当前行的下一行
Prior 当前行的前一行
First 第一行
Last 最后一行
Absolute n n>0,定位到从开始的第n行
n=0 没有返回行
n<0 定位到末尾前的第n行
Relative n n<-1 定位到当前行之前的第n行
n=-1 通Prior关键字相同
n=0 定位到当前行 [重读]
n=1 同Next关键字相同
N>1定位到当前行之后的第n行
Code
---声明游标
DECLARE @MyVariable CURSOR
DECLARE @LastName varchar(50), @FirstName varchar(50)
select @LastName,@FirstName
DECLARE MyCursor CURSOR FOR
SELECT top 10 keyid,keyname FROM test1
open MyCursor
while @@Fetch_status=0
begin
FETCH next FROM MyCursor INTO @LastName, @FirstName
select @LastName,@FirstName
end
close mycursor
deallocate mycursor
--删除语句
declare test cursor for
select top 10 ID from test1 order by ID asc
declare @ID nvarchar(10)
open test
fetch next from test into @ID
while @@fetch_status=0
begin
delete from test1 where ID=@ID
fetch next from test into @ID
end
close test
deallocate test
--更新UPDATE语句
declare test cursor for
select top 50 ID from test1 order by ID
declare @ID nvarchar(10),@ID2 int
open test
set @ID2=0
fetch next from test into @ID
while @@fetch_status=0
begin
SET @ID2 = @ID2 + 1
update test1
set keyname=Cast(@ID2 as nvarchar(10))
where ID=@ID
fetch next from test into @ID
end
close test
deallocate test
go
每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:
· 0 表示成功执行FETCH语句。
· -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
· -2 表示被提取的行不存在。
由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。
Code
USE master
GO
CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname, @msg varchar(100), @cmd varchar(100)
DECLARE table_cur CURSOR FOR
SELECT name FROM sysobjects WHERE type=’u’
OPEN table_cur
FETCH NEXT FROM table_cur INTO @TableName
WHILE @@fetch_status = 0
BEGIN
IF @@fetch_status = -2
CONTINUE
SELECT @msg = “Building indexes for table”+@TableName+”…”
PRINT @msg
SELECT @cmd = “DBCC DBREINDEX (‘”+@TableName+”')”
EXEC (@cmd)
PRINT “ “
FETCH NEXT FROM table_cur INTO @TableName
END
DEALLOCATE table_cur
GO
下面的脚本将为PUBS数据库执行sp_BuildIndexes
USE pubs
GO
EXEC ap_BuildIndexes
Code
use pubs
go
declare @int int
declare mycursor scroll cursor
for select job_id from jobs
open mycursor
Fetch Next From mycursor into @int --之前缺少这句 ,
---@@Fetch_status 所得到的数值总是-1
while @@Fetch_status = 0
begin
print @int
FETCH Next FROM mycursor into @int
end
close mycursor
deallocate mycursor