加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer游标理解

发布时间:2020-12-12 15:20:29 所属栏目:MsSql教程 来源:网络整理
导读:游标操作的六步骤: ?◆在每次在创建游标的时候都问问自己,用什么别的方法可以避免使用游标,那么你就步如设计的正规了. ????1.声明 ????2.打开 ????3.应用/操作 ????4.关闭. ????5.释放 ??????声明游标的基本语法如下: ??????Declare cursor name cursor ????

游标操作的六步骤:
?◆在每次在创建游标的时候都问问自己,用什么别的方法可以避免使用游标,那么你就步如设计的正规了.
????1.声明
????2.打开
????3.应用/操作
????4.关闭.
????5.释放
??????声明游标的基本语法如下:
??????Declare <cursor name> cursor
??????For <select statement>

??

案例1: MySchool

if exists(select * from sysobjects where name='cursc')

??? drop proc cursc

Go

create procedure cursc

as

declare

?????? @question varchar(210),???????? --我们必须声明变量来存放得到的记录

?????? @a varchar(50),

?????? @b varchar(50),

?????? @c varchar(50),

?????? @d varchar(50),

?????? @answer varchar(50),

?????? @num int

?

declare MyCursor cursor? --声明我们的游标

Global --全局 游标的范围还有一个是局部(Local)

for select question ,OptionA,OptionB,OptionC,OptionD,Answer from question? --对应的SQL语句 后面打开游标就是打开

?

set @num=1 --设置标量表示游标的移动

?

open MyCursor --打开我们的游标这实际执行了For从句的主体查询,但我们仍然没有将数据

??? ?????? ??--放在合适的位置进行合适的处理,因此我们需要处理一组事情.

????????????????????????????????????????????????--1.获取第一条理路或者Fetch

???????????????????????????????????????????????????? ?--2.根据需要,循环剩余记录

??? fetch next from MyCursor into @question,@a,@b,@c,@d,@answer

??? --首先生成第一条Fetch(提取)--该命令说明了希望提取一条特定的的记录,得到的记录由变量接受

?

??? print ''+cast(@num as varchar)+'个问题:'+'?? 答案A'+@a+'?? 答案B'+@b+'?? 答案C'+@c+'?? 答案D'+@d++'?? 正确答案是'+@answer

??? --对得到的记录进行对应操作(第一次) --如果忘了再这里进行操作那么会少操作一行数据

?

while (@@fetch_status=0)?--@@fetch_status全局变量,每次提取一行,该变量就更新一次

?

???????????????????? ?--并告诉我们提取工作进展到了哪一步.他可能值为以下项

???????????????????? ?--□? 0:提取成功,一切进展顺利???? ||语句成功

???????????????????? ?--□ -1:提取失败或此行不在结果集中,超出了游标中的最后一行(或在第一行之前)?? ||Fetch语句失败或行不在结果集中

???????????????????? ?--□ -2:提取失败,被提取的行不存在,因为记录丢失(不是循环到了末尾,而是因为在游标打开时已经删除了该记录)??? || 提取的行不存在

??? begin?

?????? select @num=@num+1??

?????? fetch next from MyCursor into @question,@answer

?????? --上面的fetch进行操作一行数据? 那么循环也要进行操作记住有次fetch 2次操作语句块

?

?????? print ''+cast(@num as varchar)+'个问题:'+'?? 答案A'+@a+'?? 答案B'+@b+'?? 答案C'+@c+'?? 答案D'+@d++'?? 正确答案是'+@answer?????????

??????

??? end

close MyCursor?????? --关闭游标

deallocate MyCursor? --释放游标

?

?

基本操作上面案例已经很清楚了

?

?

范围:

?

?

局部(Local)与全局(Global) 选项决定了游标的范围,也就是说,连接和处理可以看见的游标

?

区别:

?????? ? 全局(Global):

??????????????????????????? :可被其他查询语句块调用

?????? ? 局部(Local)

??????????????????????????? :作用于当前查询语句块 其他地方不能被使用

滚动性:

1.?????? 只向前: 由字面意思就可以看出,他的选项就是Fetch Next

a)???????? 在移动到下一条记录之前,你需要处理提取的每一条记录,因为一旦该记录消失了,就在也不能返回到以前的记录了,除非关闭并且重新打开游标

b)??????? 他与普通的select 语句相似? 都只能由上往下瀑布模型 不能返回

2.? 可滚动

?????? a)?? 你可以根据需要滚动游标向前或者向后

?????? b)?? 滚动的基础是Fetch关键词. 你可以使用Fetch镶嵌或向后移动游标,也而已在移动到特定的位置.

?????? c)?? Fetch的主要参数如下:

???????????????????????????????????????????????? 1:Next 移动到下一条记录

???????????????????????????????????????????????? 2:Prior 移动前一条记录:

??????????????????????????? ?????????????????????????????????????????????????????? 当我们跳转了最后一行 从后往前运行

fetch prior from MyCursor into @question,@answer

???????????????????????????????????????????????? 3:First 移动到第一条记录

???????????????????????????????????????????????? 4:Last 移动到最后一条记录

???????????????????????????????????????????????? 5:Absolute 跳转到第几行数据

???????????????????????????????????????????????????? ???? --指向第几行数据,正数代表从开始到第行数据,-2代表从末尾开始倒数第行

fetch ABSOLUTE 2 from Employee_Cursor;

--从游标现在所在位置开始,指向第几行

fetch RELATIVE 2 from Employee_Cursor

???????????????????????????????????????????????? 6:指向第几行

???????????????????????? ???????????????????? ?????? ???? --从游标现在所在位置开始,指向第几行

fetch RELATIVE 2 from Employee_Cursor

?

游标类型:

???????????:静态型

????????????? :键集驱动型

????????????? :动态型

?????????????????? :只快速向前行

:静态型

???????? :静态游标 对数据进行更改,并不会影响基表的数据???

declare MyCursor cursor? --声明我们的游标

Global

?????? Scroll?????????????????? --可滚动

Static?????????????????? --静态的,

for select question ,Answer from question

???????? :键集驱动型

?????????????????? : 不明白

???????? :动态型:

: declare MyCursor cursor? --声明我们的游标

Global

?????? Scroll?????????????????? --可滚动

Dynamic????????????????? --动态

for select question ,Answer from question

???????? :只快速向前行 Fast Forward cursor

?????????????????? :

?

案例②:

/*游标实现分页局限版*/

--得到1-10条的记录

use pubs

Go

if exists(select * from sysobjects where name='proc_fenye2')

drop procedure proc_fenye2

GO

create proc proc_fenye2

as

declare mycur cursor

global

scroll?

for

??? select * from jobs

open mycur

??? declare @ID int,@job nvarchar(100),@min int,@max int,@leijia int

??? set @leijia=0

??? fetch absolute 5 from mycur into @ID,@job,@min,@max

??? select cast(@ID as varchar),cast(@min as varchar),cast(@max as varchar)

while (@@fetch_status=0 and @leijia<5)

??? begin

?????? set @leijia =@leijia+1

?????? fetch next from mycur into @ID,@max

?????? select cast(@ID as varchar),cast(@max as varchar)

??? end

close mycur

deallocate mycur

Go

?

?

?

游标的一些基本操作:

--声明一个滚动游标

DECLARE Employee_Cursor SCROLL CURSOR FOR

SELECT LastName, FirstName

FROM Employees

?

--打开游标

OPEN Employee_Cursor;

--声明两个变量存储游标中获取的数据

declare @lastname varchar(20),@firstname varchar(20)

--游标指向下一行数据

FETCH next? FROM Employee_Cursor

--存入变量

into @lastname,@firstname

--查看变量结果

print @firstname+' '+@lastname

--游标状态,表示有下一行数据,-1代表无下一行数据

print @@FETCH_STATUS

?

--游标指向第一行数据

fetch first from Employee_Cursor;

--游标指向上一行数据

fetch prior from Employee_Cursor;

--游标指向最后一条数据

fetch last from Employee_Cursor;

--指向第几行数据,正数代表从开始到第行数据,-2代表从末尾开始倒数第行

fetch ABSOLUTE 2 from Employee_Cursor;

--从游标现在所在位置开始,指向第几行

fetch RELATIVE 2 from Employee_Cursor

?

--循环读取所有数据

WHILE @@FETCH_STATUS = 0

BEGIN

??? FETCH NEXT FROM Employee_Cursor

END;

?

--关闭游标

CLOSE Employee_Cursor;

--删除游标

deallocate Employee_Cursor;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读