您的位置:新葡亰496net > 网络数据库 > 新葡亰496net:SQL游标学习总计,底工知识梳理

新葡亰496net:SQL游标学习总计,底工知识梳理

发布时间:2019-11-23 15:16编辑:网络数据库浏览(81)

    游标的定义

    Cursor

    DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
         [ FORWARD_ONLY | SCROLL ]
         [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
         [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
         [ TYPE_WARNING ]
         FOR select_statement
         [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
    [;]

    1。可以在Declare语句中为cursor赋值,也能够行使SET来为游标赋值;
    2。LOCAL标记所定义的游标在当前上下文中可知(当前批管理/存款和储蓄进程/函数中可以预知卡塔 尔(英语:State of Qatar),
       GLOBAL标注所定义的游标在现阶段总是(SESSION卡塔 尔(英语:State of Qatar)中可以知道,包罗调用的存放进程/函数内部可知,私下认可时利用GLOBAL;
    3。FORWARD_ONLY标记定义游标只可以从结果集顶上部分向尾部移动,访谈的是sTATIC结果集;SCROLL标注游标能够向自由方向移动。
    4。STATIC表明游标所操作的结果集为静态,试行时将结果集COPY归入TempDB中,使得后续或外界操作匡正数据任然不会潜濡默化游标操作的结果集;
       DYNAMIC则与STATIC相反,当数码在持续操作或外界操作中被改革时,游标读取的数量是修正后的数量;
       KEYSET介于STATIC与DYNAMIC之间,只将游标结果集中每行的主键保存到TmepDB中;
       FAST_FO本田CR-VWAD依靠上下文接纳接受STATIC或DYNAMIC中风流洒脱种
    5。READ_ONLY标明游标只读取多少而不做其余退换操作
       SCROLL_LOCKS申明游标锁定结果聚集数据,幸免外界操作改过数据
       OPTIMISTIC不会锁定结果集中数据,但当在游标中立异数据时,假如该数量没有被表面操作更新,则游标更新也许得逞,反之则战败;
    6。使用OPEN CU奥德赛SOHighlander来开荒触发器
    7。使用FETCH [NEXT|PRIOR|FIRST|LAST|ABSOLUTE(N)|RELATIVE(N)] FROM cursorName INTO 来获取数据;
    8。使用CLOSE来关闭游标
    9。使用DEALLOCATE来刑满释放解除劳教游标

    --=============================================================================================
    @@FETCH_STATUS枚举值:
    0:The FETCH statement was successful.
    -1:The FETCH statement failed or the row was beyond the result set.

    游标概念

    由select语句重返的结果集富含知足该语句的where子句中条件的具有行。但是有时应用程序并不总能将整个结果集作为叁个单元来拍卖,那个应用程序必要生机勃勃种体制以便每一遍管理结果聚焦的生龙活虎行活后生可畏都部队分行。游标正是提供这种体制的结果集扩张。
      游标主要用在蕴藏进程、触发器和T-SQL脚本中。游标饱含一下两个部分。

    • 游标结果集(Cursor Result Set)由定义该游标的select语句再次来到的行的集合
    • 游标地方(Cursor Position)指向那些集结中某生机勃勃行的指针

    新葡亰496net 1

    游标具有以下优点:

    • 允许定位在结果聚焦的一定行
    • 从结果集的眼失去工作位检索风度翩翩行或多行
    • 支持对结果集中当前岗位的行开展数据改善
    • 为由别的客商对呈现在结果集中的数据库数据所做的变动提供差异级其余可以预知性扶植

    T-SQL查询进级-10分钟精晓游标

    概述

           在关周详据库中,大家对于查询的考虑是面向集结的。而游标打破了那豆蔻梢头法规,游标使得我们思谋方式改为逐行进行.对于类C的开采职员来着,那样的考虑格局会特别安适。

           平常面向集合的考虑方法是:

           2

           而对于游标来讲:

           3

          那也是干什么游标是残忍的,它会使开辟人士变懒,懒得去想用面向集结的询问艺术落到实处有些功能.

          相像的,在品质上,游标会吃越多的内部存款和储蓄器,裁减可用的出现,占用宽带,锁定财富,当然还会有愈来愈多的代码量……

          从游标对数据库的读取情势来讲,简单看出行标为啥占用越多的财富,打个举个例子:

              1

          当你从ATM取钱的时候,是贰回取1000效用更加高呢,依旧取13遍100?

    既然如此游标这么“邪恶”,为啥还要学习游标

          笔者个人感到存在既是合理.总结来讲,学习游标原因笔者回顾为以下2点

        1.留存系统有局部游标,大家询问必得透过游标来贯彻

        2.看成一个备用情势,当大家穷尽了while循环,子查询,有的时候表,表变量,自行建造函数或任何措施扔来不可能完结某个查询的时候,使用游标完毕.

    T-SQL中游标的生命周期以至落到实处

        在T-SQL中,游标的生命周期由5片段构成

    1.定义三个游标

         在T-SQL中,定义一个游标能够是特轻易,也得以相对复杂,决议于游标的参数.而游标的参数设置决定于你对游标原理的刺探程度.

         游标其实能够了然成二个定义在特定数据集上的指针,我们得以决定那几个指针遍历数据集,或然唯有是指向特定的行,所以游标是概念在以Select初始的多少集上的:

         4

         T-SQL中的游标定义在MSDN中如下:

    DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 

         [ FORWARD_ONLY | SCROLL ] 

         [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 

         [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 

         [ TYPE_WARNING ] 

         FOR select_statement 

         [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

    [;]

        

       看起来很令人讨厌是吧.上边稳重讲一下如何定义游标:

       游标分为游标类型和游标变量,对于游标变量来说,据守T-SQL变量的定义方法(啥,不知晓T-SQL变量定义的准绳?参谋作者眼下的博文卡塔 尔(阿拉伯语:قطر‎.游标变量协理二种方法赋值,定义时赋值和先定义后赋值,定义游标变量像定义其余部分变量同样,在游标前加”@”,注意,即便定义全局的游标,只帮助定义时直接赋值,况且不能够在游标名称后面加“@”,二种概念方式如下:

        5

        下边大家来看游标定义的参数:

         LOCAL和GLOBAL二选一

         LOCAL意味着游标的活着周期只在批处理或函数或存储进度中凸现,而GLOBAL意味着游标对于特定连接作为上下文,全局内有效,比如:

         6

         假设不钦定游标成效域,默许效用域为GLOBAL

         FORWARD_ONLY 和 SCROLL 二选一

         FORWARD_ONLY意味着游标只好从数额集初步向数据集结束的样子读取,FETCH NEXT是并世无双的选项,而SCROLL扶持游标在概念的多寡集中向任何方向,或此外岗位移动,如下图:

         7

        STATIC  KEYSET  DYNAMIC  和 FAST_FORWARD 四选一

        那多个基本点字是游标所在数据集所反应的表内数据和游标读收取的多寡的关联

        STATIC意味着,当游标被确即刻,将会创造FOCR-V后边的SELECT语句所蕴藏数据集的副本存入tempdb数据库中,任何对于底层表内数据的改换不会影响到游标的内容.

        DYNAMIC是和STATIC完全相反的选项,当底层数据库改革时,游标的开始和结果也随之拿到反映,在下壹次fetch中,数据内容会随着改变

        KEYSET能够领略为介于STATIC和DYNAMIC的折中方案。将游标所在结果集的独步一时能明确每生龙活虎行的主键存入tempdb,当结果聚集任何行改动照旧去除时,@@FETCH_STATUS会为-2,KEYSET不能探测新步向的数额

        FAST_FOEnclaveWA讴歌MDXD可以了解成FO牧马人WA宝马7系D_ONLY的优化版本.FOTiguanWAEnclaveD_ONLY施行的是静态布署,而FAST_FO宝马X3WATiguanD是依据事态开展选取选择动态布署依旧静态安排,大比超多场地下FAST_FORWARD要比FORWARD_ONLY品质略好.

        READ_ONLY  SCROLL_LOCKS  OPTIMISTIC 三选一 

        READ_ONLY意味着表明的游标只好读取数据,游标不可能做其它更新操作

        SCROLL_LOCKS是另大器晚成种极端,将读入游标的具有数据实行锁定,幸免别的程序开展改造,以担保更新的相对化成功

        OPTIMISTIC是相对相比好的八个抉择,OPTIMISTIC不锁定任何数据,当须要在游标中更新数据时,若是底层表数据更新,则游标内数据更新不成功,假设,底层表数据未更新,则游标内表数据足以改善

    2.开拓游标

        当定义完游标后,游标要求开拓后使用,独有轻松风流倜傥行代码:

    OPEN test_Cursor

        注意,当全局游标和部分游标变量重名时,暗中同意会张开局地变量游标

    3.施用游标

       游标的使用分为两有的,生龙活虎部分是操作游标在数额集内的针对性,另大器晚成局部是将游标所指向的行的局地或全体内容实行操作

       只有帮忙6种运动选项,分别为到第生龙活虎行(FI福睿斯ST),最终大器晚成行(LAST),下黄金年代行(NEXT),上意气风发行(P奥迪Q5IO帕杰罗),直接跳到某行(ABSOLUTE(n)),相对于方今跳几行(RELATIVE(n)),举例:

         8

        对于未钦赐SCROLL选项的游标来讲,只扶助NEXT取值.

        第一步操作完结后,就经过INTO关键字将那行的值传入局地变量:

        举个例子下边代码:

        10

        9

          游标平时会和全局变量@@FETCH_STATUS与WHILE循环来协同使用,以落成遍历游标所在数据集的指标,举例:

        11

    4.关闭游标

        在游标使用完现在,必定要记得关闭,只须要生龙活虎行代码:CLOSE 游标名称

    CLOSE test_Cursor

     

    5.保释游标

        当游标不再需求被运用后,释放游标,只必要一行代码:DEALLOCATE 游标名称

    DEALLOCATE test_Cursor

     

    对此游标一些优化提出

         要是能毫无游标,尽量不要接收游标

         用完用完之后自然要关张和刑释

         尽量不要在大气数据上定义游标

         尽量不要接收游标上更新数据

         尽量不要选拔insensitive, static和keyset那些参数定义游标

         假设能够,尽量使用FAST_FOTucsonWATiggoD关键字定义游标

         要是只对数据进行读取,当读取时只用到FETCH NEXT选项,则最佳使用FO科雷傲WALANDD_ONLY参数

     

    总结

         本文从游标的基本概念,到生命周期来谈游标。游标是十一分邪恶的风华正茂种存在,使用游标通常会比选拔面向集结的法子慢2-3倍,当游标定义在大数据量时,那个比例还或许会增加。要是恐怕,尽量选拔while,子查询,不常表,函数,表变量等来代替游标,记住,游标永世只是你最终无奈之下的精选,并非首要推荐。

    ========

    结果集,结果集就是select查询以往回来的兼具行数据的会见。

    -2: The row fetched is missing.

    DECLARE @userId INT;
    DECLARE @userName NVARCHAR(200);
    DECLARE myCursor CURSOR READ_ONLY FAST_FORWARD FOR
    SELECT UserId,UserName FROM dbo.Users

    OPEN myCursor
    FETCH NEXT FROM myCursor INTO @userId,@userName
    WHILE(@@FETCH_STATUS=0)
    BEGIN
    PRINT @userName
    FETCH NEXT FROM myCursor INTO @userId,@userName
    END

    CLOSE myCursor
    DEALLOCATE myCursor

    行使游标

    T-SQL游标使用

     

    采纳游标(cursor) 的三个至关首要的原因正是把集结操作转变到单个记录管理格局。用 SQL 语言从数据库中找找数据后,结果放在内部存款和储蓄器的一块区域中, 且结果往往是五个富含八个记录的汇集。游标机制允许客户在 SQL server 内逐行地拜谒那几个记录,依据客商本身的心愿来显示和管理这么些记录。

    1. 干什么选用游标:

             使用游标 (cursor) 的三个首要的因由就是把集合操作转变到单个记录管理情势。用 SQL 语言从数据库中搜寻数据后,结果放在内部存款和储蓄器的一块区域中,且结果往往是三个带有多少个记录的集纳。游标机制允许客商在 SQL server 内逐行地访问这几个记录,依照客商本人的意思来体现和管理那些记录。

    1. 怎么样接收游标:

         日常地,使用游标都固守下列的常规步骤:

          (1)  评释游标。把游标与 T-SQL 语句的结果集联系起来。 

          (2)  打开游标。 

          (3)  使用游标操作数据。 

          (4)  关闭游标。

    2.1. 宣称游标

    DECLARE CULANDSO奥迪Q5 语句 SQL-92 标准语法格式:

    DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR

    FOR   sql-statement

    Eg:

    Declare MycrsrVar Cursor

    FOR Select * FROM tbMyData

    2.2  展开游标

    OPEN MycrsrVar

    当游标被张开时,行指针将本着该游标集第 1 行以前,假如要读取游标聚集的第 1 行数据,必得移动行指针使其针对性第 1 行。就本例来说,能够运用下列操作读取第 1 行数据:

        FETCH FIRST from E1cursor

         或 FETCH NEXT from E1cursor

    2.3      使用游标操作数据    

    上面包车型地铁自己要作为表率遵从规则用 @@FETCH_STATUS 调节在一个 WHILE 循环中的游标活动

    /* 使用游标读取数据的操作如下。 */
    DECLARE E1cursor cursor     /* 声明游标,默认为 FORWARD_ONLY 游标 */
    FOR SELECT * FROM c_example
    OPEN E1cursor               /* 打开游标 */
    FETCH NEXT from E1cursor    /* 读取第 1 行数据 */
    WHILE @@FETCH_STATUS = 0    /* 用 WHILE 循环控制游标活动 */
    BEGIN
             FETCH NEXT from E1cursor  /* 在循环体内将读取其余行数据 */
    END
    CLOSE E1cursor              /* 关闭游标 */
    DEALLOCATE E1cursor         /* 删除游标 */
    

    2.4    关闭游标

        使用CLOSE 语句关闭游标

    CLOSE { { [ GLOBAL ]游标名  } | 游标变量名  }

    行使DEALLOCATE 语句删除游标,其语法格式如下:

    DEALLOCATE { { [ GLOBAL ]游标名  } | @ 游标变量名 

    1. FETCH操作的分明语法如下:

     FETCH

             [ NEXT | PRIOR | FIRST | LAST]

    FROM

    {游标名  | @ 游标变量名  } [ INTO @ 变量名  [ , …] ]

    参数表达:

    NEXT  取下风流浪漫行的数目,并把下风流浪漫行作为当前进 ( 依次增加 ) 。由于展开游标后,行指针是指向该游标第 1 行以前,所以首先次试行 FETCH NEXT 操作将得到游标聚集的第 1 行数据。 NEXT 为暗中认可的游标提取选项。

    INTO @变量名 [,…]  把提取操作的列数据放到局地变量中。列表中的各类变量从左到右与游标结果集中的附和列相关联。各变量的数据类型必需与相应的结果列的数据类型相称或是结果列数据类型所支撑的隐性转变。变量的数码必需与游标选用列表中的列的数码生机勃勃致。


    每施行贰个FETCH 操作之后,平日都要翻看一下全局变量 @@FETCH_STATUS 中的状态值,以此判别 FETCH 操作是或不是中标。该变量有二种状态值:

    · 0 表示成功实践 FETCH 语句。

    · -1 代表 FETCH 语句退步,举例移动行指针使其超越了结果集。

    · -2 表示被提取的行不设有。

    由于@@FETCH_STATU 是全局变量,在一个总是上的全体游标都恐怕影响该变量的值。由此,在试行一条 FETCH 语句后,必需在对另黄金时代游标实施另风度翩翩 FETCH 语句以前测量检验该变量的值才干作出准确的决断。 

    --示例 

    declare @Familyid int 
    declare @address nvarchar(100)
    DECLARE E1cursor cursor       /* 声明游标,默认为 FORWARD_ONLY 游标  */ 
    FOR SELECT address FROM FamilyInfo where Family_id<10 
    OPEN E1cursor                 /* 打开游标  */ 
    FETCH NEXT from E1cursor into @address    /* 读取第 1 行数据 */ 
    WHILE @@FETCH_STATUS = 0      /* 用 WHILE 循环控制游标活动  */ 
    BEGIN 
      SELECT * FROM mHUB_fnSplit(@address,'%') where @@rowcount<4 
        FETCH NEXT from E1cursor into @address  /*读取其它记录 */ 
    END
    CLOSE E1cursor               
     DEALLOCATE E1cursor  
    

    ========

    游标(Cursor):

    SELECT COUNT(1) FROM dbo.Users

    1.尽量防止使用游标
    2.用到完游标一定得停业并释放
    3.生龙活虎旦能够,尽量接收只读(READ_ONLY)向前(FAST_FORWARD)游标
    4.幸免大结果集操作

     

     

    阐明游标

    游标在行使在此之前,必须先注明。其语法格式如下:

    DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 
         [ FORWARD_ONLY | SCROLL ] 
         [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
         [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
         [ TYPE_WARNING ] 
         FOR select_statement 
         [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
    
    • LOCAL | GLOBAL (游标生存周期)
        LOCAL钦点该游标的节制对在其间创立它的批管理、存款和储蓄进程或触发器是一些的。
        GLOBAL钦命该游标范围对三番五次是大局的。 在经过连连实施的其余部存款和储蓄器储进度或批管理中,都足以援引该游标名称。 该游标仅在断开连接时隐式释放。

      新葡亰496net 2

    • FORWARD_ONLY | SCROLL (读取方向)
        FORWARD_ONLY钦赐游标只可以从第豆蔻梢头行滚动到最后生龙活虎行。 FETCH NEXT 是唯大器晚成帮助的提取选项。
        SCROLL帮衬游标在概念的数目汇总向任何方向,或其余地点移动(FI奥迪Q5ST、LAST、P冠道IO奥迪Q5、NEXT、RELATIVE、ABSOLUTE卡塔 尔(阿拉伯语:قطر‎。

      新葡亰496net 3

    • STATIC | KEYSET | DYNAMIC | FAST_FORWARD(表内数据与游标读收取的数据的涉及)

    • STATIC:静态游标。当游标被确登时,将会成立SELECT语句所包涵数据集的别本存入TempDB数据库中。你在操作游标的时候,不论怎么着操作数据库,游标中的数据集都不会变,并且此游标不容许改善。
    • DYNAMIC:动态游标。和STATIC完全相反,滚动游标时,动态游标反应结果集中的有着退换。结果集中的行数据值、顺序和成员在每一回提取时都会生成。全部顾客做的增加和删除改语句通过游标均可以看到。
    • FAST_FORWARD:**只进游标 **。只进游标不扶植滚动,只扶植从头至尾顺序提取数额,数据库实施增加和删除改,在提取时是可以见到的,但由于该游标只可以进不可能向后滚动,所以在行提取后对行做增加和删除改是不可以见到的。钦点启用了品质优化的 FOSportageWA兰德酷路泽D_ONLY、READ_ONLY 游标。
    • KEYSET:键集游标。将游标所在结果集的唯后生可畏能鲜明每后生可畏行的主键存入TempDB,结果集那么些行数据被大器晚成组唯豆蔻梢头标识符标志。对基表中的非键值所做的修改(由游标全部者校订或由别的顾客提交卡塔尔国能够在客商滚动游标时观望。 别的客商施行的插入是不可知的,因为该行未有被标记,除非重新展开游标才可知。要是查询引用了足足四个无独一索引的表,则键集游标将退换为静态游标。
    • READ_ONLY | SCROLL_LOCKS | OPTIMISTIC(是或不是允许在游标中期维改过数据)
    • READ_ONLY:幸免通过该游标举办更新。 在 UPDATE 或 DELETE 语句的 WHERE CU奥迪Q5RENT OF 子句中不能够引用游标。
    • SCROLL_LOCKS :将行读入游标时,锁定那几个行(行锁),确认保障删除或更新一定会成功。
    • OPTIMISTIC:当将行读入游标时,SQL Server 不锁定行。 它改为运用的比较时间戳列的值或只要表未包涵别的校验和值时间戳列,来规定是否它已读入游标后已修正行。 要是读的时候该行已被改变过,尝试进行的永世更新或定点删除将倒闭。
    • FOR UPDATE [ OF column_name [ ,...n ] ]
        定义游标中可更新的列。假设钦赐了 [ OF column_name [ ,...n ] ],则只同意更改所列出的列,不然能够立异全部列。
    • TYPE_WA本田UR-VNING:钦赐假如游标从所央浼的门类隐式转换为另意气风发种等级次序,则向客商端发送警报消息。
    • STATIC 和 FAST_FOXC60WARAV4D 游标默以为 READ_ONLY。
    • DYNAMIC 和 KEYSET 游标默以为 OPTIMISTIC。
    • 若是在钦定 FORWA科雷傲D_ONLY 时不内定 STATIC、KEYSET 和 DYNAMIC 关键字,则游标作为 DYNAMIC 游标举行操作。
    • 如果 FORWARD_ONLY 和 SCROLL 均未钦定,那么除非钦命了 STATIC、KEYSET 或 DYNAMIC 关键字,不然暗中认可值为 FO科雷傲WAPRADOD_ONLY。 STATIC、KEYSET 和 DYNAMIC 游标默以为 SCROLL。 与 ODBC 和 ADO 那类数据库 API 分裂,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标扶助FORubiconWA大切诺基D_ONLY。
    • 动态游标不辅助ABSOLUTE提取选项。
    • 假诺钦命了 SCROLL 或 FO奥德赛_UPDATE,则不能够也内定FAST_FORWARD。
    • FAST_FORWARD 和 FORWARD_ONLY 能够况且用在同三个 DECLARE CUEscortSO中华V语句中。
    • 如若钦定了 FAST_FOGranTurismoWA福睿斯D 或 STATIC,则不能够钦命 SCROLL_LOCKS。

    游标分为游标类型和游标变量。游标类型正是CU普拉多SRO关键字,正如上面所示。游标变量扶持三种艺术赋值,定义时赋值和先定义后赋值,定义游标变量像定义别的部分变量相似,在游标前加”@”。注意,假如定义全局的游标,只扶助定义时直接赋值,並且不能够在游标名称前面加“@”,三种概念格局如下:

    -- 定义后直接赋值
    DECLARE test_cursor CURSRO FOR select * from dbo.tb1
    
    -- 先定义后赋值
    DECLARE @test_cursor2 CURSRO 
    SET @test_cursor2=CURSRO FOR select * from dbo.tb2
    

    SQL Server游标

    什么是游标

    结果集,结果集就是select查询以往重临的持有行数据的汇集。

    游标则是管理结果集的后生可畏种机制吗,它能够固定到结果聚集的某风华正茂行,多数据举行读写,也得以活动游标定位到你所须求的行中实行操作数据。

    日常复杂的仓库储存进程,都会有游标的产出,他的用场主要有:

    稳固到结果集中的某大器晚成行。

    对近来岗位的数额实行读写。

    新葡亰496net:SQL游标学习总计,底工知识梳理。能够对结果聚集的数量单独操作,并不是整行履行相仿的操作。

    是面向集合的数据库管理种类和面向行的顺序设计之间的桥梁。

    游标的分类

    基于游标检测结果集变化的力量和消耗电源的事态差别,SQL Server扶持的API服务器游标分为一下4种:

    静态游标: 静态游标的结果集,在游标张开的时候成立在TempDB中,不论你在操作游标的时候,如何操作数据库,游标中的数据集都不会变。举例你在游标展开的时候,对游标查询的数据表数据开展增加和删除改,操作之后,静态游标中select的数码依旧显示的为未有操作从前的数额。假诺想与操作之后的多少大器晚成致,则另行关闭展开游标就可以。

    动态游标:那个则与静态游标相对,滚动游标时,动态游标反应结果聚集的享有改变。结果集中的行数据值、顺序和分子在历次提取时都会转变。全数顾客做的增加和删除改语句通过游标均可知。要是应用API函数或T-SQL Where Current of子句通过游标实行立异,他们将立时可知。在游标外界所做的翻新直到提交时才可以看到。

    只进游标:只进游标不扶助滚动,只辅助自始至终顺序提取数据,数据库执行增加和删除改,在提取时是可以见到的,但由于该游标只可以进无法向后滚动,所以在行提取后对行做增加和删除改是不可以知道的。

    键集驱动游标:张开键集驱动游标时,该有表中的逐一成员身份微风姿浪漫一是固定的。张开游标时,结果集这么些行数据被意气风发组唯生龙活虎标志符标记,被标记的列做删改时,客户滚动游标是可以预知的,假使没被标志的列增该,则不可以看到,比方insert一条数据,是不可知的,若可以见到,须关闭重新打开游标。

    静态游标在滚动时质量评定不到表数据变化,但消耗的财富相对超少。动态游标在滚动时能检查实验到具备表数据变化,但消耗的财富却比较多。键集驱动游标则处于他们个中,所以依照必要创立契合自个儿的游标,防止资源浪费。。

    游标的生命周期

    游标的生命周期富含有四个品级:表明游标、张开游标、读取游标数据、关闭游标、释放游标。

     1.声称游标,语法

    复制代码

    DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 

         [ FORWARD_ONLY | SCROLL ] 

         [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 

         [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 

         [ TYPE_WARNING ] 

         FOR select_statement 

         [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

    复制代码

    参数表明:

    cursor_name:游标名称。

    Local:功效域为一些,只在概念它的批管理,存款和储蓄进程或触发器中一蹴而就。

    Global:功能域为全局,由连接实践的任何存款和储蓄进度或批管理中,都能够援引该游标。

    [Local | Global]:默认为local。

    Forward_Only:钦点游标智能从第大器晚成行滚到最终后生可畏行。Fetch Next是并世无两援救的领到选项。假如在钦定Forward_Only是不钦点Static、KeySet、Dynamic关键字,默感到Dynamic游标。借使Forward_Only和Scroll未有一点点名,Static、KeySet、Dynamic游标默以为Scroll,法斯特_Forward默认为Forward_Only

    Static:静态游标

    KeySet:键集游标

    Dynamic:动态游标,不支持Absolute提取选项

    Fast_Forward:钦定启用了质量优化的Forward_Only、Read_Only游标。假设钦点啦Scroll或For_Update,就无法钦命他啊。

    Read_Only:不可能由此游标对数据开展删改。

    Scroll_Locks:将行读入游标是,锁定这个行,确认保障删除或更新一定会中标。如若钦赐啦法斯特_Forward或Static,就不可能钦赐他呀。

    Optimistic:钦命若是行自读入游标以来已赢得更新,则通过游标进行的固定更新或稳固删除不成事。当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的相比结实来规定行读入游标后是还是不是产生了改造,假如表不行timestamp列,它改用校验和值进行规定。纵然已校勘改行,则尝试实行的固化更新或删除将退步。要是钦点啦法斯特_Forward,则不能够钦点他。

    Type_Warning:钦赐将游标从所必要的类型隐式调换为另风姿洒脱种层次时向顾客端发送警报新闻。

    For Update[of column_name ,....] :定义游标中可更新的列。

    2.声明一(Nutrilon卡塔 尔(英语:State of Qatar)个动态游标

    declare orderNum_02_cursor cursor scroll

    for select OrderId from bigorder where orderNum='ZEORD003402'

    3.开采游标

    --张开游标语法

    open [ Global ] cursor_name | cursor_variable_name

    cursor_name:游标名,cursor_variable_name:游标变量名称,该变量援用了三个游标。

    --展开游标

    open orderNum_02_cursor

    4.领到数据

    复制代码

    --提取游标语法

    Fetch

    [ [Next|prior|Frist|Last|Absoute n|Relative n ]

    from ]

    [Global] cursor_name

    [into @variable_name[,....]]

    复制代码

    参数表达:

    Frist:结果集的率先行

    Prior:当前岗位的上生机勃勃行

    Next:当前地点的下少年老成行

    Last:最后生龙活虎行

    Absoute n:从游标的第黄金年代行起始数,第n行。

    Relative n:从当前义务数,第n行。

    Into @variable_name[,...] : 将提取到的数目贮存到变量variable_name中。

    例子:

    复制代码

    --提取数据

    fetch first from orderNum_02_cursor

    fetch relative 3 from orderNum_02_cursor

    fetch next from orderNum_02_cursor

    fetch absolute 4 from orderNum_02_cursor

    fetch next from orderNum_02_cursor

    fetch last from orderNum_02_cursor 

    fetch prior from orderNum_02_cursor

    select * from bigorder where orderNum='ZEORD003402'

    复制代码

    结果(相比一下,就精通啊卡塔 尔(英语:State of Qatar):

    例子:

    --提取数据赋值给变量

    declare @OrderId int

    fetch absolute 3 from orderNum_02_cursor into @OrderId

    select @OrderId as id

    select * from bigorder where orderNum='ZEORD003402'

    结果:

    经过检查实验全局变量@@Fetch_Status的值,获得提取状态音信,该意况用于判别Fetch语句重临数据的卓有功用。当试行一条Fetch语句之后,@@Fetch_Status恐怕现身3种值:0,Fetch语句成功。-1:Fetch语句失败或行不在结果聚集。-2:提取的行一纸空文。

    本条情形值能够帮您认清提取数额的成功与否。

    复制代码

    declare @OrderId int

    fetch absolute 3 from orderNum_02_cursor into @OrderId

    while @@fetch_status=0  --提取成功,举办下一条数据的提取操作

     begin

       select @OrderId as id

       fetch  next from orderNum_02_cursor into @OrderId  --移动游标

     end 

    复制代码

    5.使用游标更新删除数据 

    --游标更正当前数码语法

    Update 基表名 Set 列名=值[,...] Where Current of 游标名

    --游标删除当前数据语法

    Delete 基表名  Where Current of 游标名

    复制代码

    ---游标更新删除当前数据

    ---1.声称游标

    declare orderNum_03_cursor cursor scroll

    for select OrderId ,userId from bigorder where orderNum='ZEORD003402'

    --2.开拓游标

    open orderNum_03_cursor

    --3.声称游标提取数额所要寄放的变量

    declare @OrderId int ,@userId varchar(15)
    --4.定位游标到哪一行
    fetch First from orderNum_03_cursor into @OrderId,@userId  --into的变量数量必须与游标查询结果集的列数相同
    while @@fetch_status=0  --提取成功,进行下一条数据的提取操作 
     begin
       if @OrderId=122182
         begin
         Update bigorder Set UserId='123' Where Current of  orderNum_03_cursor  --修改当前行
         end
       if @OrderId=154074
          begin
          Delete bigorder Where Current of  orderNum_03_cursor  --删除当前行
          end
       fetch next from orderNum_03_cursor into @OrderId ,@userId  --移动游标
     end  
    

    6.关门游标

     游标打开后,服务器会特别为游标分配一定的内部存款和储蓄器空间贮存游标操作的多少结果集,同有毛病间使用游标也会对某个数据开展封锁。所以游标生机勃勃旦用过,应即时关门,幸免服务器财富浪费。

    --关闭游标语法

    close [ Global ] cursor_name | cursor_variable_name

    --关闭游标

    close orderNum_03_cursor

    7.去除游标

    删去游标,释放财富

    --释放游标语法

    deallocate  [ Global ] cursor_name | cursor_variable_name

    --释放游标

    deallocate orderNum_03_cursor

    ========

    • 是拍卖数据的豆蔻梢头种办法。
    • 它能够牢固到结果聚集的某豆蔻梢头行,对数码实行读写。
    • 也能够移动游标定位到你需求的行中举办多少操作。
    • 是面向集结的数据库管理种类和面向行的程序设计之间的桥梁

    游标函数

    (1)@@CURSOR_ROWS
      获得当前游标中留存的数额行数。注意:此变量为二个连连上的全局变量,因而只对应最后叁次展开的游标。
      @@CURSOR_ROWS重回值为整数,意义如下:

    新葡亰496net 4

    (2)@@FETCH_STATUS
      重回针对连续当前开辟的任何游标发出的末段一条游标 FETCH 语句的状态音信,该音信用于判别该FETCH语句重回数据的管用。
      @@FETCH_STATUS再次来到值为整数,意义如下:

    新葡亰496net 5

    (3)CURSOR_STATUS
      二个标量函数,它同意存储进度的调用方明确该存款和储蓄进度是还是不是已为给定的参数重回了游标和结果集。此函数的语法为:

    CURSOR_STATUS   
         (  
              { 'local' , 'cursor_name' }   
              | { 'global' , 'cursor_name' }   
              | { 'variable' , 'cursor_variable' }   
         )  
    
    • 'local'钦赐二个常量,该常量提醒游标的源是一个本地游标名。
    • 新葡亰496net:SQL游标学习总计,底工知识梳理。'global'钦点叁个常量,该常量提示游标的源是叁个大局游标名。
    • 'variable'内定三个常量,该常量提示游标的源是多个地面变量。
    • cursor_variable:游标变量的名称。
    • cursor_name:游标的名号。

    CURSOR_STATUS重回类型为smallint

    新葡亰496net 6

    T-SQL 游标 游标更新数据

     游标的引进

     1 .在多少的费用进度中,从某风流罗曼蒂克结果聚集逐风度翩翩读取一条记下,用游标消除,游标占能源大,明显不用后将其获释。

     2 .注明游标(八个组成都部队分卡塔 尔(英语:State of Qatar)

     ( 1 ).declare游标

     ( 2 ).open游标

     ( 3 ).从几个游标中fetch消息

     ( 4 ).close或deallocate游标

     大器晚成、申明游标主要内容:

     ( 1 ).游标名字

     ( 2 ).数据来源表和列

     ( 3 ).选拔条件

     ( 4 ).属性仅读或可校订

     1 .语法格式:

     declare  游标名称  [ scroll ]   cursor 

     [ local|global ] 

     [ forward_only|scroll ] 

     for  选择语句

     [ for[read_only|update [of 字段名称1,字段名称2, ] ]]

     其中:

     1 > .local | global钦赐该游标的作用域是部分的仍旧大局的。

     2 > .如果把forward_only选择为forward_only, 则游标只可以从第大器晚成行滚动到最后大器晚成行。

     3 > .scroll评释全体的领到操作,如first,last,prior, next ,relative,absolute都可用。如不使用该保留字,那么只可以举办next提取操作。

     4 > .选择语句:是概念结果集的select语句,应该小心的是在游标中无法运用compute, compute   by   for  browse  into语句.

     5 > . read   only :申明分裂意游标内的数目被更新。

     6 > . update [ of 字段名1[, n ] ]:定义在游标中可被涂改的列。

     

     例1:标准游标

     declare  taihang  cursor 
     for 
     select  id,name,address,city,state
     from   table 
    

     例2:只读游标

     declare  taihang  cursor 
     for 
     select  id,name,address,city,atate
     from   table 
     for   read   only 
    

     例3:更新游标

     declare  taihang  cursor 
     for 
     select  name,address
     from   table 
     for   update 
    

     

     二、展开游标

     1 .注解之后,如要从游标中读取数据,必须张开游标,使用open命令。

     语法:

     open  游标名称

     注意:

     1 > .在张开游标时,若是游标注明语句中运用了insensitive保留字,则open发生叁个不经常表来贮存结果集。若是在结果集中任何风姿罗曼蒂克行数据的轻重缓急超过SQL Server定义的最大行尺寸时,open命令将倒闭。

     2 > .insensitive: 表明SQL Server会将游标定义所选用出来的多寡记录贮存在一暂且表内,(创建在tempdb数据库下卡塔 尔(阿拉伯语:قطر‎对该游标的操作皆由临时表来回答。因而,对 基本表的退换并不影响游标提取数据,即游标不会随着基本表内容的改造面改造,同期也不法通过游标来更新基本表。

     

     假诺不利用该保留字,那么对基本表的翻新,删除都会播出到游标中。

     

     三、读取游标中的数据- fetch 

     1 .当游标被成功开垦以往就能够从游标中逐行地读取数据以时行相关管理。从游标中读取数据重要采纳fetch命令。

     语法:

     fetch 

     [ [next|prior|first|last

     |absolute{n|@nvar}

     |relative{n|@nvar} ] 

     from ] cursor_name

     [ into @variable_name1,@variable_name2 ] 

     注:

     1 > . next :重回结果聚集当前进的下意气风发行,并扩张当前进数为回去行行数。借使fetch next是首先次读取游标中多少,则赶回结果聚集的第生机勃勃行并不是第二行。

     2 > .prior:再次回到结果聚焦当前进的前风流洒脱行,并压缩当下行数为回到行行数。如若fetch prior是首先次读取游标中的数据,刚无多少记录重回,并把游标地点设为第风华正茂行。

     3 > .first:再次回到游标中的第生龙活虎行。

     4 > .last:重临游标中的最终后生可畏行。

     5 > .absolute{n | @nvar }:假如N或 @nvar为正数 ,则表示从游标中回到的数据行数。假如N或 @nvar为负数,则赶回游标内从最后意气风发行数据算起的第N或 @nvar行数据 。若N或 @nvar超越游标的数码子集范畴 ,则@@fetch_status再次回到 - 1 。在该景况下,假如N或 @nvar为负数 ,则再施行fetch next命令会博得第风流洒脱行数据;若是N或 @nvar为正在 ,如实行fetch prior命令刚会赢得终极生龙活虎行数据。N或 @nvar能够是原则性值 ,也足以是smallint,tinyint或int类型的变量。

     6 > .relative{N | @nvar }:若N或 @nvar为正数 ,则读取游标当前地方起向后的第N或 @nvar行数据 。要是N或@nvar为负数 ,则赶回游标当前职分起向前的第N或 @nvar行数据 。若N或 @nvar超越游标的数码子集范畴 ,则 @@fetch_status重返 - 1 。在该意况下,如若N或 @nvar为负数 ,则再进行fetch next命令会拿到第生机勃勃行数据;假使N或 @nvar为正值 ,如进行fetch prior命令刚会获得最终生龙活虎行数据。N或 @nvar能够是稳定值 ,也足以是smallint,tinyint或int类型的变量。

     7 > . into @variable_name [ , n ] :允许利用fetch命令读取的多寡存放在八个变量中;在变量行中的每一个变量必须与游标结果集中相应的列相对应,每风度翩翩变量的数据类型也要与游标中的数据列的数据类型相匹配。

     

     2 .检查游标状态

     @@fetch_status :全局变量,再次来到上次实行fetch命令的意况,在每一遍用fetch从游标中读取数据时,都应反省该变量以鲜明上次fetch操作是或不是成功,来支配怎样举行下一步管理。 @@fetch_status变量有多个不等重返值。

     1 > . 0 :表示成功抽出了一站式。

     2 > . - 1意味未取到数码。游标地点超出结果集。

     3 > . - 2意味着回去的行已经不再是结果集的三个分子,这种气象独有在游标不是insensitive的状态下冒出,即别的进度已去除了行或转移了游标张开的要害值。

     

     3 .编辑脚中游标行

     平常,用游标来从底蕴表中检索数据,以完毕对数据行管理,在改革游标中的数据,即开展一定更新或删除游标所含有的数目,所以必得实行此外的换代或删除命令, 并在where子句中另行给定条件技巧修正到该行数据,可是要是在证明游标时使用了for update语句那么就能够在update或delete命令 中以where  current  of关键字直接改变或删除当前游标中所存款和储蓄的数量,而不要选拔where子句再次提交钦点条件。当更改游标中数量时,这种变化会自动地影响到游标的底蕴表。但是假设在证明游标时选用了insensitive选项时,该游标中的数据无法被改革。

     

     进行固定纠正或删除游标中的数据的语准则则语法:

     update  table_name

     set  column_name1 = {expression1 | null (select_statement)}

       [ ,column_name2={expression2|null(select_statement)} ] 

     where   current   of  cursor_name

     

     delete   from  table_name

     where   current   of  cursor_name

     其中:

     1 > .table_name:是update或delete的表名。

     2 > .column_name:uqdate的列名

     3 > .cursor_name:游标名

     

     例1:首先声贝拉米(Bellamy卡塔 尔(阿拉伯语:قطر‎个游标

     

    declare  authors_cur scroll  cursor 
     for 
     select   *   from  authors
     for   update   of  au_lname,au_fname
    

     

     更新authors表中的au_lname和au_fname列

     

    update  authors
     set  au_lname = ' china ' ,au_fname = ' asia ' 
     where   current   of  authors_cur
    

     

     删除authors表中的大器晚成行数据

     delete   from  authors

     where   current   of  authors_cur

     注:以上的更新或删除操作总是在游标的脚下职责,

     

     例:上边是多个完全的一定更新的例证。

     

    declare   @au_id   int ( 11 ), @au_lname   varchar ( 40 ), @au_fname   varchar ( 20 )
     declare  authors_cur  cursor 
     for 
     select  au_id,au_lname,au_fname  from  authors
     for   update   of  au_id,aulname,au_fname
     open  authors_cur   
     fetch   next   from  authors_cer  into   @au_id , @au_lname , @au_fname 
     while   @@fetch_status = 0    
     begin  
       if   @au_id = ' 172-32-1176 ' 
       update  authors
     set  au_lname = ' smith ' ,au_fname = ' jake ' 
     where   current   of  authors_cur
    
     fetch   next   from  authors_cer  into   @au_id , @au_lname , @au_fname 
     end 
     deallocate  authors_cur   
    

      四、释放游标

     1 .关闭游标

     使用close命令关闭游标,在拍卖完游标中数据之后,公布闭馆游标来刑满释放解除劳教数据结果集和确定地点于数据记录上的锁,close语句关闭游标但不自由游标占用的数据结构。要是准备在随之的使用中再一次展开游标,则应使用open命令。

     语法: close  游标名称

     2 .释放游标

     在利用游标时各类针对游标的操作依然援用游标各也许援用指向游标的游标变量,当close命令关闭游标时并未自由游标占用的数据结构。由此常动用deallocate命令删除掉游标与游标名或游标变量之间的牵连,並且释放游标占用的具备系统财富。

     语法: deallocate  游标名称

    ========

    游标的归类

    开拓游标

    OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }  
    
    • GLOBAL选项内定其后的游标为大局游标。
    • cursor_name:已证明的游标的称谓。
    • cursor_variable_name:游标变量的名号,该变量援引一个游标。
    • 当施行展开游标的口舌时,服务器将施行申明游标时行使的select语句
    • 若果注明游标中动用了STATIC关键字,则服务器会在TempDB中确立二个一时表,存放游标就要进行操作的结果集的别本。
    • 借使运用 KEYSET 选项证明了游标,则服务器会在TempDB中树立二个有的时候表寄存键值。
    • 尽管结果聚集任意行的尺寸超越 SQL Server 表的最大行大小,OPEN 将失利。
    • 行使OPEN语句展开游标后,游标地点位于查询结果集的第黄金年代行

    试问怎么用T-sql完毕游标的递归

    好象TSQL里面游标是个全局变量

    有未有其余办法能够消除啊

    能够注重存储进度的递归,在仓库储存进度里面使用LOCAL表明游标为一些游标。

    create     FUNCTION   dbo.GetSubClass(@Code_No   varchar(50),@IdStr   varchar(8000)='',@LevelCount   int=-1)     

      /*   

      参数: @Code_No   ,被搜寻子类的ID   

      @IdStr,八个非同小可参数,用于在递归中传数据,注意:调用函数时必须求传播‘’空值   

      @LevelCount   用于决断是还是不是递归调用的最上层   

      */   

      RETURNS   Varchar(8000)   

        AS       

      BEGIN     

        

      Declare   @single_no   varchar(50),   @TC_ID   varchar(50),@TC_PID   Varchar(50),@StartLevel   int,@Id32   int,@Ma_price   Numeric(19,3)   

        

      if   @LevelCount=-1   

      begin   

      set   @StartLevel=@@NESTLEVEL   

      set   @LevelCount=@StartLevel   

      end   

      else     

      set   @StartLevel=-1   

          

        

      If   @IdStr=''   Set   

          

              @IdStr='''' @InputId   ''''   

          

      DECLARE   TreeClass   CUENCORESOSportage   local   FO安德拉   --定义游标   

          Select   b.single_no,b.Code_No   From   Mrp_Modec   a   ,Mrp_Mode   b   where   a.single_no=b.single_no   and   In_Code=   @InputId   

              

      OPEN   TreeClass   

      FETCH   NEXT   FROM   TreeClass   

      INTO   @single_no,@TC_ID   

        

      WHILE   @@FETCH_STATUS   =   0 --循环游标,即循环当前类的弟一流子类   

      BEGIN   

                    if         exists(select   *   from   mrp_modec     )     

                              

                                      select   @Ma_price=Sum(sta_qty*u_price)   from       Mrp_Modec   Where       single_no=@single_no       

                        update   表名   SET   字段=   @Ma_price   WHERE       single_no=@single_no     --这里为啥通不过   

          select   @IdStr=   @IdStr ',' cast(@tC_ID   as   varchar) ''''   

        

      if   @@NESTLEVEL<32   

            

                                      set   @IdStr=   dbo.GetSubClass(@TC_ID,@IdStr,@LevelCount)   --递归。   

          

      else   

      set   @IdStr='[' cast(@tC_新葡亰496net,ID   as   varchar) ']' @IdStr   

        

        

      FETCH   NEXT   FROM   TreeClass   iNTO   @single_no,@tC_ID     

        

      End   

        

      CLOSE   TreeClass   

      DEALLOCATE   TreeClass   

        

      /*while   @StartLevel=@@NESTLEVEL   and   charindex(']',@IdStr)>0   

      begin   

      set   @Id32=substring(@IdStr,2,charindex(']',@IdStr)-2)   

      set   @IdStr=dbo.FN_32GetSubClass   (@Id32,@IdStr,@LevelCount)   

      set   @IdStr=replace(@IdStr,'[' cast(@Id32   as   varchar) ']','')   

      end   

      */   

      Return     @IdStr   

        

      END   

      

    然则小编还要输出行标啊 

    得到一个结实集

    对这几个结果集在操作

    里头要用到递归

    楼主参照他事他说加以考查一下:

    游标默确定义是global

    用上面包车型地铁概念就足以了

    declare 游标名 CU凯雷德SO途乐 LOCAL  -- LOCAL钦点游标为一些的(暗中同意是GLOBAL, 全局的)

    FOR

    只是递归咋办啊 

    出口参数为游标

    ========

    SQL Server支持的API服务器游标分为4种:
    静态游标( STATIC 卡塔 尔(阿拉伯语:قطر‎意味着,当游标被确立时,将会创建FOCR-V前边的SELECT语句所包涵数据集的副本存入tempdb数据库中,任何对于底层表内数据的改善不会潜移默化到游标的从头到尾的经过。
    动态游标( DYNAMIC 卡塔 尔(阿拉伯语:قطر‎是和STATIC完全相反的选项,当底层数据库校订时,游标的内容也随着拿到呈现,在下三次fetch中,数据内容会随着变动。
    键集驱动游标( KEYSET 卡塔 尔(阿拉伯语:قطر‎能够知晓为介于STATIC和DYNAMIC的折中方案。将游标所在结果集的唯风度翩翩能分明每黄金时代行的主键存入tempdb,当结果集中任何行退换只怕去除时,@@FETCH_STATUS会为-2,KEYSET无法探测新步向的数据。
    只进游标    能够清楚成不援救滚动,只扶持自始自终顺序提取数额,数据库施行增加和删除改,在提取时是可知的,但鉴于该游标只好进无法向后滚动,所以在行提取后对行做增加和删除改是不可以预知的。 ( FAST_FO纳瓦拉WA奥迪TTD 能够领悟为FO福睿斯WA汉兰达D_ONLY的优化版本.FO途睿欧WA奥迪Q5D_ONLY实行的是静态安插,而FAST_FO帕杰罗WAEvoqueD是依靠事态开展抉择使用动态陈设依旧静态安插,大许多景色下FAST_FORWARD要比FORWARD_ONLY品质略好。

    领到数据

    开拓游标后,就足以选用fetch语句从询问结果集。使用fetch语句二回能够领到一条记下,具体的语法格式如下:

    FETCH   
              [ [ NEXT | PRIOR | FIRST | LAST   
                        | ABSOLUTE { n | @nvar }   
                        | RELATIVE { n | @nvar }   
                   ]   
                   FROM   
              ]   
    { { [ GLOBAL ] cursor_name } | @cursor_variable_name }   
    [ INTO @variable_name [ ,...n ] ]   
    
    • NEXT:读取当前进的下生机勃勃行,并把这几个“下风流罗曼蒂克行”置为当前行。next为私下认可的游标提取选项。假如FETCH NEXT 为对游标的率先次提取操作,则赶回结果集中的第生机勃勃行。
    • PENCOREIO昂科威:读取当前进的上后生可畏行,并把这几个“上风流倜傥行”置为当前进。
    • FI奥迪Q5ST:再次来到游标中的第后生可畏行并将其当做当前进。
    • LAST:再次回到游标中的最终后生可畏行并将其看做当下行。
    • ABSOLUTE { n| @nvar}
    • 只要n或@nvar为正数,提取从游标头开端的第n行,并将赶回的行产生新的脚下行;
    • 即使n或@nvar为负数,提取从游标尾在此之前的第n行,并将赶回的行造成新的当下行;
    • 若是n或@nvar为0,则尚未行重临;
    • n必需为整型常量,@nvar必需为smallint、tinyint或nit;
    • RELATIVE { n| @nvar}
    • 若果n或@nvar为正数,提取当前进以后的第n行,并将回来的行形成新的日前进;
    • 借使n或@nvar为负数,提取当前进此前的第n行,并将赶回的行产生新的近些日子进;
    • 要是n或@nvar为0,提取当前进;
    • 若是对游标的首先次提取操作时将fetch relative的n或@nvar钦点为负数或0,则从未行再次回到;
    • n必需为整型常量,@nvar必得为smallint、tinyint或nit;
    • GLOBAL:钦命其后的游标是大局游标。
    • @ INTOvariable_name[,...n]:允许将提取操作的列数据放到局部变量中。 列表中的各类变量从左到右与游标结果聚焦的照管列相关联。 各变量的数据类型必得与相应的结果集列的数据类型相称,或是结果集列数据类型所扶持的隐式转换。 变量的数据必需与游标接纳列表中的列数大器晚成致。
    • 后生可畏旦钦赐了 FO瑞虎WALacrosseD_ONLY 或 FAST_FOMuranoWA奥迪Q7D,则 NEXT 是独步天下受帮助的 FETCH 选项。
    • 假使未内定 DYNAMIC、FORWA奥迪Q7D_ONLY 或 FAST_FO讴歌RDXWATucsonD 选项,并且钦赐了 KEYSET、STATIC 或 SCROLL 中的某多个,则扶助全部 FETCH 选项。
    • DYNAMIC SCROLL 游标补助除 ABSOLUTE 以外的有着 FETCH 选项。
    • 万意气风发想操作当前进的话,就用current of <游标名>|<游标变量名>

    游标的语法

    关闭游标

    CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }  
    
    DECLARE cursor_name CURSOR [ LOCAL |GLOBAL ] 
         [ FORWARD_ONLY | SCROLL ] 
         [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
         [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
         [ TYPE_WARNING ] 
         FOR select_statement 
         [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
    

    放飞游标

    关门游标并不改进游标的概念,能够另行张开该游标。但是,释放游标就释放了与钦点游标有关的万事财富,再度利用该游标必需另行评释。
      对游标举办操作的语句使用游标名称或游标变量援用游标。 DEALLOCATE 删除游标与游标名称或游标变量之间的涉嫌。 假设三个称呼或变量是最终引用游标的名称或变量,则将释放游标,游标使用的其余能源也随后释放。 用于保证提取隔开的滚动锁在 DEALLOCATE 上释放。 用于维护更新(满含经过游标举行的定位更新卡塔 尔(英语:State of Qatar)的事务锁平昔到事情甘休才放走。

    DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }  
    

    cursor_name:游标名称。
    Local:功用域为部分,只在概念它的批管理,存款和储蓄进度或触发器中有效。
    Global:效用域为大局,由三番两遍试行的别的存款和储蓄进程或批管理中,都能够征引该游标。
    [Local | Global]:默认为local。
    Forward_Only:钦命游标智能从第后生可畏行滚到最终大器晚成行。 Fetch Next是并世无两扶助的领取选项。假诺在钦点Forward_Only时不点名Static、KeySet、Dynamic关键字,默以为Dynamic游标。假使Forward_Only和Scroll没有一点名,Static、KeySet、Dynamic游标默以为Scroll,法斯特_Forward默认为Forward_Only
    Static:静态游标
    KeySet:键集游标
    Dynamic:动态游标,不支持Absolute提取选项
    Fast_Forward:内定启用了品质优化的Forward_Only、Read_Only游标。
    Read_Only:意味着评释的游标只好读取数据,游标不可能做别的更新操作
    Scroll_Locks:将读入游标的具备数据开展锁定,幸免别的程序开展转移,以作保更新的相对化成功
    Optimistic:是对峙比较好的叁个选项,OPTIMISTIC不锁定任何数据,当要求在游标中立异数据时,假使底层表数据更新,则游标内数据更新不成功,如若,底层表数据未更新,则游标内表数据能够创新。
    Type_Warning:内定将游标从所伏乞的项目隐式调换为另风流倜傥种档案的次序时向顾客端发送警报消息。
    For Update[of column_name ,....] :定义游标中可更新的列。

    示例

    A、 使用 FETCH 将值存入变量

    DECLARE @LastName varchar(50), @FirstName varchar(50);  
    
    DECLARE contact_cursor CURSOR FOR  
    SELECT LastName, FirstName FROM Person.Person  
    WHERE LastName LIKE 'B%'  
    ORDER BY LastName, FirstName;  
    
    OPEN contact_cursor;  
    
    FETCH NEXT FROM contact_cursor INTO @LastName, @FirstName;  
    
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
       PRINT 'Contact Name: '   @FirstName   ' '    @LastName    
       FETCH NEXT FROM contact_cursor INTO @LastName, @FirstName;  
    END  
    
    CLOSE contact_cursor;  
    DEALLOCATE contact_cursor;  
    GO  
    

    B、 评释 SCROLL 游标并利用其余 FETCH 选项

    -- Declare the cursor.  
    DECLARE contact_cursor SCROLL CURSOR FOR  
    SELECT LastName, FirstName FROM Person.Person  
    ORDER BY LastName, FirstName;  
    
    OPEN contact_cursor;  
    
    -- Fetch the last row in the cursor.  
    FETCH LAST FROM contact_cursor;  
    
    -- Fetch the row immediately prior to the current row in the cursor.  
    FETCH PRIOR FROM contact_cursor;  
    
    -- Fetch the second row in the cursor.  
    FETCH ABSOLUTE 2 FROM contact_cursor;  
    
    -- Fetch the row that is three rows after the current row.  
    FETCH RELATIVE 3 FROM contact_cursor;  
    
    -- Fetch the row that is two rows prior to the current row.  
    FETCH RELATIVE -2 FROM contact_cursor;  
    
    CLOSE contact_cursor;  
    DEALLOCATE contact_cursor;  
    GO  
    

    C、CURSOR_STATUS
    上边包车型地铁亲自过问使用 CU奥迪Q5SOQX56_STATUS 函数字突显示游标在开发和倒闭在此以前和事后的事态。

    CREATE TABLE #TMP (ii int)  
    GO  
    
    INSERT INTO #TMP(ii) VALUES(1)  
    INSERT INTO #TMP(ii) VALUES(2)  
    INSERT INTO #TMP(ii) VALUES(3)  
    GO  
    
    --Create a cursor.  
    DECLARE cur CURSOR FOR SELECT * FROM #TMP  
    
    --Display the status of the cursor before and after opening,closing the cursor.  
    SELECT CURSOR_STATUS('global','cur') AS 'After declare'  
    OPEN cur  
    SELECT CURSOR_STATUS('global','cur') AS 'After Open'  
    CLOSE cur  
    SELECT CURSOR_STATUS('global','cur') AS 'After Close'  
    
    DEALLOCATE cur  
    DROP TABLE #TMP  
    

    上面是结果集:

    After declare
    ---------------
    -1
    After Open
    ----------
    1
    After Close
    -----------
    -1
    

    怎么着定义游标

    游标变量补助二种办法赋值,定义时赋值和先定义后赋值,定义游标变量像定义其余一些变量同样,在游标前加”@”,注意,假使定义全局的游标,只援助定义时一贯赋值,并且不能够在游标名称后边加“@”,二种概念方式如下:
    --定义后直接赋值
    DECLARE test_Cursor CURSOR FOR
    SELECT * FROM TABLE1
    --先定义后赋值
    DECLARE @test_Cursor2 CURSOR
    SET @test_Cursor2=CURSOR FOR
    SELECT * FROM TABLE2

    --定义后直接赋值
    DECLARE test_Cursor CURSOR LOCAL FOR
    SELECT * FROM TABLE1
    DECLARE test_Cursor2 CURSOR GLOBAL FOR
    SELECT * FROM TABLE2
    --用GO甘休上面作用域
    GO
    --张开游标
    OPEN test_Cursor
    OPEN test_Cursor2
    全局游标在批管理达成后还是有效
    部分游标在批管理完毕后被隐式释放,无法再其余批处理中援用
      假诺不钦点游标效能域,暗许成效域为GLOBAL
     注意,当全局游标和生机勃勃部分游标变量重名时,默许会展开局地变量游标

    领取游标语法 

    Fetch [ [Next|prior|Frist|Last|Absoute n|Relative n ]
    from
    [Global] cursor_name
    into @variable_name[,....]]
    参数表明:
    Frist:结果集的首先行
    Prior:当前职责的上风流洒脱行
    Next:当前岗位的下生龙活虎行
    Last:最终黄金时代行
    Absoute n:从游标的首先行起首数,第n行。
    Relative n:从相对当前岗位数,第n行。(n为负数向前数,不然向后卡塔 尔(阿拉伯语:قطر‎
    Into @variable_name[,...] : 将提取到的多少存放到变量variable_name中。
    在意:    对于未钦定SCROLL选项的游标来讲,只援助NEXT取值.

    实战创立游标

    计划表数据

    新葡亰496net 7

    始建游标

    --声明游标
    declare test_Cursortable3 CURSOR FOR
    SELECT id,NAME FROM TABLE3
    --打开游标
    OPEN test_Cursortable3
    --声明游标提取变量所要存放的变量
    declare @id int,@name varchar(20)
    --定位游标到哪一行
    fetch next from test_Cursortable3 into @id,@name    --into的变量数量必须需与游标查询结果的列数相同
    --fetch FIRST from test_Cursortable3 into @id,@name
    while @@FETCH_STATUS=0  --提取成功,进行下一条数据的提取操作
    begin
        if @id=2
        begin
        Update TABLE3 Set sex='0' Where Current of test_Cursortable3 --更新当前行
        end
        if  @id=10
        begin
        delete TABLE3 where current  of test_Cursortable3    --删除当前行
        end
    fetch next from test_Cursortable3 into @id,@name    --移动游标
    end
    --关闭游标
    close    test_Cursortable3
    --释放游标
    deallocate test_Cursortable3
    

    进行理并了结果

    新葡亰496net 8

    注释:

    @@fetch_status是MicroSoft SQL SESportageVEEscort的一个全局变量
    其值有以下两种,分别代表两种分化含义[再次来到类型integer]
    0 FETCH 语句成功
    -1 FETCH 语句退步或此行不在结果聚集
    -2 被提取的行一纸空文

     

    利用游标时注意事项:

    游标张开后,服务器会专门为游标分配一定的内部存款和储蓄器空间存放游标操作的数目结果集,同期使用游标也会对某个数据开展封锁。所以游标意气风发旦用过,应即时关门,防止服务器财富浪费。

    尽或然不要在大气数码上定义游标
    尽恐怕不要采纳游标上立异数据
    尽恐怕不要接纳insensitive, static和keyset这么些参数定义游标
    假如能够,尽量选用FAST_FOLacrosseWA卡宴D关键字定义游标
    借使只对数码进行读取,当读取时只用到FETCH NEXT选项,则最棒利用FO途胜WA中华VD_ONLY参数

    意气风发经能毫无游标,尽量不要选拔游标

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net:SQL游标学习总计,底工知识梳理

    关键词: