zoukankan      html  css  js  c++  java
  • 游标

    不带ORDER BY 子句的查询返回的是一个集合(或多集),而带有ORDER BY 子句的查询返回的是一种ANSI 称为游标(cursor)的对象,因为这种结果的行之间具有固定的顺序,所以不是关系的结果。

    在默认情况下应该使用基于集合的查询,只在有令人信服的理由时才考虑使用游标。

    因为

    1.如果使用游标,就严重违背了关系模型,关系模型要求按照集合来考虑问题。

    2.游标逐行对记录进行操作会带来一定的开销。和基于集合的操作相比,游标分别对每一记录进行操作,这肯定会带来一定的额外开销。给定一个基于集合的查询,以及一段在幕后用游标完成类似物理处理的代码,游标代码通常比基于集合的代码要慢许多倍。

    3.使用游标,需要为解决方案的物理操作编写很多代码,换句话说,得写很多代码来描述如何处理数据(声明游标、打开游标、循环遍历游标记录、关闭游标、释放游标)。而使用基于集合的解决方案,则主要关注于问题的逻辑方面,也就是说,只要描述要获取什么,而不必描述如何获取它们。因此,与基于集合的解决方案相比,基于游标的解决方案通常代码更长,可读性更低,也更加难以维护。

    使用游标通常涉及以下步骤:

    1. 在某个查询的基础上声明游标。

    2. 打开游标。

    3. 从第 1 个游标记录中把列值提取到指定的变量。

    4. 当还没有超出游标的最后一行时(@@FETCH_STATUS 函数的返回值是0),循环遍历游标记录;在每一次遍历中,从当前游标记录中把列值提取到指定的变量,再为当前行执行相应的处理。

    5. 关闭游标。

    6. 释放游标。

    DECLARE @ID int
    DECLARE @Name nvarchar(max)
    DECLARE C CURSOR   
     FOR SELECT categoryId,categoryname FROM dbo.Categories   -- 定义游标
    OPEN C      -- 打开游标
    FETCH NEXT FROM C INTO @ID,@Name  -- 移向第一个游标
    --SELECT @ID+@Name
    WHILE @@FETCH_STATUS=0
    BEGIN
     SELECT str(@ID)+@Name
     FETCH NEXT FROM C INTO @ID,@Name  --移向下一条数据
    END
    CLOSE C;                 -- 关闭游标
    DEALLOCATE C              -- 释放游标

  • 相关阅读:
    CF1327D Infinite Path 抽象代数
    CF1426 ABCDEF 数学+思维+DP
    CF1332E Height All the Same 计数
    CF1327E Count The Blocks 简单计数
    【CF1304】Codeforces Round #620 (Div. 2) 【思维+回文+构造+ST表】
    【CF1301】Codeforces Round #619 (Div. 2) 【思维+贪心+模拟+构造+二维ST表】
    【CF1255A】Changing Volume【思维】
    Json Master masters JSON!
    Polyglot Translators: Let's do i18n easier! 一款国际化插件小助手!
    mns: Money Never Sleeps! 自己开发的一款 IDEA 插件介绍.
  • 原文地址:https://www.cnblogs.com/zhangdx/p/3790213.html
Copyright © 2011-2022 走看看