Sqlserver 游标读取固定行数据

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

今天有人问我,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来实现的,下面看一下实现效果

创建临时表

image.png 只获取第一行数据(使用next关键字) fetch next from stuCur

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

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

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
复制代码

猜你喜欢

转载自juejin.im/post/7094999115079254053