`

MS-SQL的游标

阅读更多
    与windows或DOS的“光标”不同,MS-SQL的游标是一种临时的数据库对象,既对可用来旋转储存在系统永久表中的数据行的副本,也可以指向储存在系统永久表中的数据行的指针。
    游标为您提供了在逐行的基础上而不是一次处理整个结果集为基础的操作表中数据的方法。

1.如何使用游标

   1)定义游标语句 Declare <游标名> Cursor  For
   2)创建游标语句 Open <游标名>
   3)提取游标列值、移动记录指针 Fetch  <列名列表>  From  <游标名>  [Into <变量列表>]
   4)使用@@Fetch_Status利用While循环处理游标中的行
   5)删除游标并释放语句 Close  <游标名>/Deallocate  <游标名>
   6)游标应用实例

   --定义游标
   Declare cur_Depart Cursor
     For  Select  cDeptID,cDeptName  From  Department  into  @DeptID,@DeptName
   --创建游标
   Open cur_Depart
   --移动或提取列值
   Fetch  From  cur_Depart  into  @DeptID,@DeptName
   --利用循环处理游标中的列值
   While  @@Fetch_Status=0
     Begin
       Print @DeptID,@DeptName
       Fetch  From  cur_Depart into  @DeptID,@DeptName
     End
   --关闭/释放游标
   Close  cur_Depart
   Deallocate  cur_Depart



2.语句的详细及注意

   1)定义游标语句

   Declare <游标名>  [Insensitive] [Scroll]  Cursor
     For  <Select 语句>  [FOR {Read Only | Update [ OF <列名列表>]}]

    Insensitive  DBMS创建查询结果集数据的临时副本(而不是使用直接引用数据库表中的真实数据行中的列)。游标是Read Only,也就是说不能修改其内容或底层表的内容;
    Scroll  指定游标支持通过使用任意Fetch 选项(First  Last  Prior  Next Relative  Absolute)选取它的任意行作为当前行。如果此项省略,则游标将只支持向下移动单行(即只支持游标的Fetch  Next);
    Select语句  定义游标结果集的标准 SELECT 语句。在游标声明的 <Select语句>内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO;
    Read Only  防止使用游标的用户通过更新数据或删除行改变游标的内容;
    Update  创建可更新游标且列出值能被更新的游标列。如果子句中列入了任意列,则只有被列入的列才能被更新。如果Declare  Cursor语句中只指定的UPDATE(没有列名列表),则游标将允许更新它的任何或所有列。
    Declare  cur_Depart  Cursor
        For  Select  *  From  Department  For  Update  OF  cDeptID,cDeptName
    2)提取游标列值、移动记录指针语句

     Fetch  [Next | Prior | First | Last | {Absolute <行号>} | {Relative <行号>}]
          From  <游标名>  [Into <变量列表……>]

    每次执行Fetch语句时,DBMS移到游标中的下一行并把游标中的列值获取到Into中列出的变量中。因此Fetch语句的Into子句中列出的变量必须与游标定义中Select 语句中的列表的类型与个数相对应;
    仅当定义游标时使用Scroll参数时,才能使用Fetch语句的行定位参数(First  Last  Prior  Next Relative  Absolute);如果Fetch语句中不包括参数Next | Prior | First | Last,DBMS将执行默认的Fetch Next;
    Next  向下、向后移动一行(记录);
    Prior  向上、向前移动一行(记录);
    First  移动至结果集的第一行(记录);
    Last  移动至结果集的最后一行(记录);
    Absolute  n  移动到结果集中的第n行。如果n是正值,DBMS从结果集的首部向后或向下移动至第n行;如果n是负数,则DBMS从结果集的底部向前或向上移动n行;
          Fetch  Absolute  2  From  cur_Depart  Into  @DeptID,@DeptName
    Relative  n   从指针的当前位置移动n行。如果n是正值,DBMS将行指针向后或向下移动至第n行;如果n是负数,则DBMS将行指针向前或向上移动n行;
          Fetch  Relative  2  From  cur_Depart  Into  @DeptID,@DeptName
    3)基于游标的定位DELETE/UPDATE语句

    如果游标是可更新的(也就是说,在定义游标语句中不包括Read Only 参数),就可以用游标从游标数据的源表中DELETE/UPDATE行,即DELETE/UPDATE基于游标指针的当前位置的操作;
    举例:

      --删除当前行的记录
     Declare cur_Depart Cursor
       For  Select  cDeptID,cDeptName  From  Department  into  @DeptID,@DeptName
     Open cur_Depart
     Fetch  From  cur_Depart  into  @DeptID,@DeptName
     Delete  From  Department  Where  CURRENT  OF  cur_Depart

    --更新当前行的内容
     Declare cur_Depart Cursor
       For  Select  cDeptID,cDeptName  From  Department  into  @DeptID,@DeptName
     Open cur_Depart
     Fetch  From  cur_Depart  into  @DeptID,@DeptName
     Update  Department  Set  cDeptID=’2007’ + @DeptID  Where  CURRENT  OF  cur_Depart



3.游标使用技巧及注意

   1)利用Order By改变游标中行的顺序。此处应该注意的是,只有在查询的中Select 子句中出现的列才能作为Order by子句列,这一点与普通的Select语句不同;
  2)当语句中使用了Order By子句后,将不能用游标来执行定位DELETE/UPDATE语句;如何解决这个问题,首先在原表上创建索引,在创建游标时指定使用此索引来实现;例如:

   Declare cur_Depart Cursor
     For  Select  cDeptID,cDeptName  From  Department  With  INDEX(idx_ID)
     For  Update  Of  cDeptID,cDeptName

    通过在From子句中增加With Index来实现利用索引对表的排序;


分享到:
评论

相关推荐

    MS SQL SERVER 游标详解

    本文提供了在MS SQL SERVER 中应用游标所应具有的有关游标的必要知识和各种语法。从中读者可以了解游标的优点、种类、作用、学会如何定义、打开、存取、关闭、释放游标以及游标的应用。除此之外,在本章的后半部分...

    MS SQLSERVER游标和锁的课件

    自己讲课用的课件,关于在MSSQLSERVER中游标和锁的使用,分享一下

    游标 ms sql 例子

    游标 ms sql 例子----- 大概模式 临时表使用等-——---

    MSSQL 游标使用 心得

    MS-SQL游标的使用及理解 windows或DOS的“光标”不同,MS-SQL的游标是一种临时的数据库对象,既对可用来旋转储存在系统永久表中的数据行的副本,也可以指向储存在系统永久表中的数据行的指针。

    MS SQL Server游标(CURSOR)的学习使用

    使用MS SQL Server这样久,游标一直没有使用过。以前都是使用WHILE循环加临时表来实现。刚刚联系个示例了解到游标概念与语法

    游标嵌套 STATUS 异常 存储过程

    一个存储过程的示例,简单展示了如下方面: ...4,对于嵌套游标STATUS的互相影响问题的解决办法《注意001和002的注释位置,fetch的位置》。 对于初学者,存储过程重要的几个方面,都有展示到,大虾们请忽略。

    MS SQL Server2005存储过程、游标、游标嵌套综合例子

    NULL 博文链接:https://modiliany.iteye.com/blog/786230

    PostgreSQL_与_MS_SQLServer比较

    从不同的方面介绍了PostgreSQL_与_MS_SQLServer之间的差异,包括变量的定义和语法结构,存储过程、函数、游标等等

    SQL21日自学通

    使用MS QUERY 来完成链接290 将VISUAL C++与SQL 结合使用292 将DELPHI 与SQL 结合使用296 总结302 问与答303 校练场303 练习303 第二周回顾304 第三周概貌305 应用你对SQL 的知识305 第15 天对SQL 语句优化以提高...

    Qt数据库封装类

    m_pDbProcPic = new CDBProcess("sqlserver"); m_pDbProc-&gt;openDB("mysvr", "mydb", "myusername", "mypwd"); m_pDbProcPic = new CDBProcess("mysql"); m_pDbProc-&gt;openDB("localhost", "mydb", "root", "password...

    实验四 存储过程、触发器与索引

    (3)使用“实验一”中的数据库“abc”,练习使用游标, 写出按如下报表形式显示结果的SQL语句,该报表查询每年每种产品总销售金额,(总销售金额=价格*销量),报表显示格式如下所示: 年 产品号 产品名 销售总量 ...

    sql语句优化之SQL Server(详细整理)

    MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。...

    MSSQL数据库查看器

    、数据库基本对象的查看(库、表、主键、过程、函数、触发器、游标、视图等) 、数据库相关系统信息 、建表脚本 、表字段相关信息 、表内数据前100条 、存储过程脚本 、过程参数列表 、数据库基本操作(分离、...

    分析MSSQL Server里函数的两种用法

    SQL Server里函数的两种用法与些同时这两种用法可以代替游标。本文将为大家介绍MS SQL Server里函数的两种用法。

    21天学习SQL V1.0

    21天学习SQL V1.0.pdf 66 SQL 21 日自学通(V1.0) 翻译人笨猪 EMAIL wyhsillypig@163.com 2 日期/时间函数.........................................................................................................

    数据库实验4-实验报告.doc

    (3)使用"实验一"中的数据库"abc",练习使用游标, 写出按如下报表形式显示结果的SQL语句,该报表查询每年每种产品总销售金额,( 总销售金额=价格*销量),报表显示格式如下所示: 年 产品号 产品名 销售总量 总...

    分页存储过程(三)在sqlserver中打造更加准确的分页结果

    昨天的那篇分页存储过程(二)在MS SQL Server中返回更加准确的分页结果 中使用了游标,有很多热心的朋友参与讨论,感谢大家的参与。

    access_to_postgresql

    通过从 pyodbc 游标(表名、数据类型等)获取信息并生成要由 psycopg2 执行的 SQL 语句来工作。 基本用法: &gt;&gt; &gt; converter = Converter ( access_con_string , pg_con_string , print_SQL ) &gt;&gt; &gt; converter . ...

    大数据量Excel 数据导入系统的设计与实现 (2014年)

    并且在临时表与目标表之间的合并过程中,摒弃了传统的游标逐条插入方式,取而代之的是SQL Server 2008中的Merge技术,极大地加快了数据库端不同表之间数据的同步过程。实验测试结果表明,整个系统导入100 万条数据...

Global site tag (gtag.js) - Google Analytics