1. 简介

    msdn原文
    1. 在C#中,当我们需要遍历一个数据集时,可以使用 foreach(){   }。这个时候,我们的操作对象是单一数据,而不是整个结果集。当我们想在后台数据库中直接面向单一数据进行操作时(比如,对一个查询结果集中的每一条记录进行不同的操作),我们需要用到Cursor。它能够将一个结果集转换为一个可遍历的集合(sql 默认情况下是面向数据集的,而不是单一记录,我们只能对整个数据集操作)。我们把cursor叫做服务端游标。

    2. cursor的声明语法分为两类:1 基于Iso 标准 2 基于Transact-SQL . 这里我只介绍Transact-SQL.

      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 ] ] ]
      [;]
    3. 学习Cursor的参数

      1. cursor_name:
        cursor的名称,需要注意的是必须遵循标识规范
      2. LOCAL:
        限定cursor的作用域:只在声明它所在的batch、stored procedure、trigger中有效。当batch、stored procedure、trigger结束时,其作用域内的cursor会被隐式释放掉。但是,如果我们使用OUTPUT,将局部cursor传递给外部的变量,那么即使batch、stored procedure、trigger已经结束,该cursor依然存在。这个时候,当引用cursor的变量被释放掉或者超出该引用变量的作用域时,cursor会被隐式释放掉。也就是说,通过OUTPUT我们可以扩大cursor的作用域。
      3. GLOBAL:
        指定cursor的作用域为全局。任何stored procedure、batch都可以引用该cursor。只有断开连接,该cursor才会被释放。
        默认值可通过数据库属性 -> option ->cursor 指定。
      4. FORWARD_ONLY:
        1. 指定游标只能从第一行滚动到最后一行。这种情况下只有Fetch Next 提取项可用。
        2. 当没有指定STATIC、KEYSET 和 DYNAMIC时,默认为Forward_Only,否则为Scroll
        3. 当指定了Forward_Only时,默认为 DYNAMIC。
      5. SCROLL:
        指定是否所有的提取操作(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)都可用。scrll跟fast_forward冲突,不可同用。
      6. STATIC:
        1. 会在tempdb中创建副本。
        2. 所有的提取操作都来自于临时表而不是基表。
        3. 不允许对cursor进行更改.(Where Current Of)
      7. KEYSET:
        1. 打开游标时,行的身份和顺序会被固定,对行进行唯一标识的键集保存在tempdb中的keyset
        2. 对基表非键值所做的更改会被映射到cursor中如果基表没有唯一键,那么cursor是STATIC的,而不是keyset
        3. 对基表的插入操作不会映射到cursor
        4. 对基表的删除操作会更新临时表的键集中对应的值为null。(并没有删除,只是为null)
        5. 对基表的键值更新操作,等同于删除添加操作。cursor中的对应位置为null
        6. 通过Where Current Of修改,不管是否是唯一键,都可以映射
      8. DYNAMIC:
        不管是值、顺序还是成员关系, 对行所做的所有更改都会反应到游标中。
        不支持ABSOLUTE
      9. FAST_FORWARD:
        指定对FORWARD_ONLY,READ_ONLY进行性能优化
        不能跟SCROLL或者FOR_UPDATE同时使用
      10. READ_ONLY:
        禁用游标的更新功能。(我的测试表明read_only无效)
      11. SCROLL_LOCKS:
        通过锁保证游标的更新删除操作一定成功。不能跟FAST_FORWARD、STATIC同用
      12. OPTIMISTIC:
        不使用所,当对应的基表存在更新时,通过cursor的update、delete会失败。不能跟FAST_FORWARD同用
      13. TYPE_WARNING:
        指定如果游标从所请求的类型隐式转换为另一种类型,则向客户端发送警告消息。
      14. select_statement:
        查询语句。不能使用关键字 COMPUTE, COMPUTE BY, FOR BROWSE, and INTO.
        您可以在游标声明中使用查询提示;但如果还使用 FOR UPDATE OF 子句,请在 FOR UPDATE OF 之后指定 OPTION (query_hint)。
        如果 select_statement 中的子句与所请求的游标类型的功能有冲突,则 SQL Server 会将游标隐式转换为其他类型。
      15. FOR UPDATE [OF column_name [,...n]]
        定义游标中可更新的列。 如果提供了 OF column_name [,...n],则只允许修改所列出的列。
        如果指定了 UPDATE,但未指定列的列表,则除非指定了 READ_ONLY 并发选项,否则可以更新所有的列。
  2. 注意


    DECLARE CURSOR 定义 Transact-SQL 服务器游标的属性,例如游标的滚动行为和用于生成游标所操作的结果集的查询。 OPEN 语句填充结果集,FETCH 从结果集返回行。 CLOSE 语句释放与游标关联的当前结果集。 DEALLOCATE 语句释放游标所使用的资源。
posted on 2016-04-07 21:41  哈哈娃以  阅读(162)  评论(0)    收藏  举报