今天有人问我,sqlserver里面的游标只能一行一行固定往下读,不能指定某一行来读取吗?

我思考了一下,应该是可以的,我看下了sqlserver 游标,发现他是有一个叫游标方向

下面简单说一下这个游标方向

FORWARD_ONLY

第一行滚动到最后一行FETCH NEXT 是唯一支持的提取选项。如果在指定 FORWARD_ONLY 时不指定 STATIC、KEYSET 和 DYNAMIC 关键字,则游标作为 DYNAMIC 游标进行操作。如果 FORWARD_ONLY 和 SCROLL 均未指定,则除非指定 STATIC、KEYSET 或 DYNAMIC 关键字,否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。与 ODBC 和 ADO 这类数据库 API 不同,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标支持 FORWARD_ONLY。

SCROLL

     指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果未在 ISO DECLARE CURSOR 中指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果也指定了 FAST_FORWARD,则不能指定 SCROLL。

今天的这个游标固定获取某一行就使用的是SCROLL来实现的,下面看一下实现效果

创建临时表

sql server取指定行数 sqlserver只取一条数据_游标

只获取第一行数据(使用next关键字)

fetch next from stuCur

sql server取指定行数 sqlserver只取一条数据_读取数据_02

只获取最后一行数据(使用last关键字) 

fetch last from stuCur

 

sql server取指定行数 sqlserver只取一条数据_sql server取指定行数_03

 只获取第三行数据(使用absolute关键字)

fetch absolute 3 from stuCur

sql server取指定行数 sqlserver只取一条数据_sqlserver_04

下面贴上完整的存储过程代码

ALTER PROCEDURE MyScroll

AS
BEGIN
	SET NOCOUNT ON;
	--创建临时表
	create table #Mystudent(
	id int primary key IDENTITY(1,1),
	stuname varchar(50),
	age int
	)
--往临时表中添加数据
insert into #mystudent values('张三①',11)
insert into #mystudent values('张三②',12)
insert into #mystudent values('张三③',13)
insert into #mystudent values('张三④',14)
insert into #mystudent values('张三⑤',15)

--创建游标
declare stuCur cursor scroll
for
select * from #mystudent
go
--打开游标
open stuCur
--读取数据开始
--fetch next from stuCur --读取当前行的下一行,并使其置为当前行(刚开始时游标置于表头的前一行,即若表是从0开始的,游标最初置于-1处,所以第一次读取的是头一行)
--fetch prior from stuCur --读取当前行的前一行,并使其置为当前行
--fetch first from stuCur --读取游标的第一行,并使其置为当前行(不能用于只进游标)
--fetch last from stuCur  --读取游标的最后一行,并使其置为当前行(不能用于只进游标)
fetch absolute 3 from stuCur --读取从游标头开始向后的第2行,并将读取的行作为新的行
--fetch relative 3 from stuCur --读取从当前行开始向后的第3行,并将读取的行作为新的行
--fetch relative-2 from stuCur --读取当前行的上两行,并将读取的行作为新的行
--读取数据结束

 --关闭游标
 close stuCur
 --销毁游标
 deallocate stuCur
 --删除临时表
 drop table #mystudent
END