SqlServer游标理解
游标操作的六步骤: ?? 案例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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |