微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SqlServer游标理解

游标操作的六步骤:
 ◆在每次在创建游标的时候都问问自己,用什么别的方法可以避免使用游标,那么你就步如设计的正规了.
    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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐