zoukankan      html  css  js  c++  java
  • SQL之游标

    在性能上,游标会吃更多的内存减少可用的并发占用宽带,锁定资源,当然还有更多的代码量…… 

    T-SQL中游标的生命周期以及实现

        在T-SQL中,游标的生命周期由5部分组成

    1.定义一个游标

         在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度.

         游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集

        或者仅仅是指向特定的行,所以游标是定义 在以Select开始的数据集上的:

    --游标(用来存储多条查询数据的一种数据结构(结果集),它有一个指针,用来上往下移动,从而达到遍历每条记录的作用

    下面仔细讲一下如何定义游标:

       游标分为游标类型和游标变量

    对于游标变量来说,遵循T-SQL变量的定义方法(啥,不知道T-SQL变量定义的规则?参考我前面的博文).

    游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,

    定义时赋值

    declare  TestCursor  Cursor for   --Cursor(克瑟)
    select * from MvcUsers

    --先定义后赋值

    declare @TestCursors cursor
    set @TestCursors=cursor for
    select * from MvcUsers

    ====================================

    -- LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见,
    --而GLOBAL意味着游标对于特定连接作为上下文,全局内有效,例如:

    declare test_cursor cursor global for--//global 全局变量,在此处理结束后依然有效,默认是global
    select * from MvcUsers
    
    declare test_cursors cursor local for--// 局部游标,在此处理结束后,被隐式释放,无法再其他批出理中调用
    select * from MvcUsers
    
    --用go执行上面的作用域
    go
    open test_cursor//打开游标
    open test_cursors--//关闭游标 close test_cursors

    --Forward_Only 和 Scroll 二选一

    FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项
    而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,

    --不加参数,默认Forward_only

    ---------------------------------------------------------------------------------

    declare Test_Cursor cursor for
    select * from MvcUsers
    --//默认和forward_only选项,只支持fetch next 选项,
    --不支持游标向后或者走向特定位置
    --加forward only
    declare Test_Cursor1 cursor forward_only for
    select * from MvcUsers
    
    --加Scroll(“滚动”)
    declare Test_Cursor2 cursor scroll for--scroll支持游标向任何方向移动
    select * from MvcUsers
    
    fetch last from Test_Cursor
    fetch last from Test_Cursor1
    fetch last from Test_Cursor2

    ✪✪✪✪使用游标

    declare TestCursor cursor scroll for --必须指定Scroll,否则只支持next只进选项
    select name from MvcUsers--这里就是将name的结果集存在了TestCursor这个游标“容器”里了
    open TestCursor
    
    declare @c varchar(20)
    --读取下一行
    Fetch next from TestCursor into @c-----这里就类比一个For循环进行把TestCursor的数据集一个个取出来~
    print @c-------------------------------------
    
    --读取最后一行
    Fetch last from TestCursor into @c
    print @c
    
    --读取第一行
    Fetch first from TestCursor into @c
    print @c
    
    --读取上一行
    Fetch Prior from TestCursor into @c
    print @c
    
    --读取第3行
    Fetch absolute 3 from TestCursor into @c
    print @c
    
    --读取相对目前来说上一行
    Fetch relative -1 from TestCursor into @c
    print @c

     转自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html

  • 相关阅读:
    Codeforces 1316B String Modification
    Codeforces 1305C Kuroni and Impossible Calculation
    Codeforces 1305B Kuroni and Simple Strings
    Codeforces 1321D Navigation System
    Codeforces 1321C Remove Adjacent
    Codeforces 1321B Journey Planning
    Operating systems Chapter 6
    Operating systems Chapter 5
    Abandoned country HDU
    Computer HDU
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/7588441.html
Copyright © 2011-2022 走看看