(一)游标

     游标(Cursor):用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中                  检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用               户自己的意愿来显示和处理这些记录

(二)游标的优点

        从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:  

              1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。  

              2)提供对基于游标位置的表中的行进行删除和更新的能力  

              3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

 (三)使用游标的步骤

           声明游标。使用T-SQL语句生成一个结果集,并且定义游标的特征,如游标中的记录是否可以修改
           打开游标。
           从游标的结果集中读取数据。从游标中检索一行或多行数据称为取数据。
           对游标中的数据逐行操作。
           关闭和释放游标

(四)声明游标

      declare 游标名 [scroll]cursor for
      <select语句>
      [for read only|for update of 列名]
      其中select语句可以是简单查询,也可以是复杂的连接查询和嵌套查询
      例:
      Declare mycursor cursor for
      select * from AddSalary

(五)游标的两种类型

 

        游标有且只有两种类型:for read onlyfor update
                  当游标方式指定为for read only时,游标涉及的表不能被修改。
                  游标方式指定为for update时,可以删除或更新游标涉及的表中的行。通常,这也是缺省方式,即不指定游标方式时为for update方式

(六)打开游标

      1)OPEN 游标名
      2)注意:
        ① 当游标打开成功时,游标位置指向结果集的第一行之前
         ② 只能打开已经声明但尚未打开的游标。
         ③ 当执行打开游标的语句时,服务器执行声明游标时使用的SELECT语句

(七)读取游标

      fetch [ next | prior | first | last|absolute|relative]
      from 游标名 
      参数说明:
           next: 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行fetch next操作将取得游                  标集中的第1行数据。next为默认的游标提取选项。

           prior: 返回紧临当前行前面的结果行,并且当前行递减为结果行。
           first:  返回游标中的第一行并将其作为当前行。LAST:返回游标中的最后一行并将其作为当前行。
           absolute:当为正时,返回从游标头开始的第 n 行并将返回的行变成新的当前行
           relative:  当为正时,返回当前行之后的第 n 行并将返回的行变成新的当前行。

(八)查看游标信息

      /*检查@@FETCH_STATUS以确定是否还可以继续取数*/
      WHILE @@FETCH_STATUS = 0
      BEGIN
          FETCH NEXT FROM authors_cur
      END

      @@FETCH_STATUS=0, FETCH 语句成功 ;
      @@FETCH_STATUS=-1, FETCH 语句失败或此行不在结果集中
      @@FETCH_STATUS=-2,被提取的行不存在。

 (九)使用游标修改数据

        通过在UPDATE语句中使用游标可以更新表或视图中的行。被更新的行依赖于游标位置的当前值.
        语法:
          UPDATE 表名(或视图名)
          SET 列名=修改后的值
          WHERE CURRENT OF 游标名
        注:
          表名可省略,但必须是声明游标中的表名.且游标必须是已经打开的游标.

(十)所有游标删除数据

          语法:
            DELETE FROM 表名
            WHERE CURRENT OF 游标名

          用于删除游标当前位置所在的行.删除一行后将游标位置向前移动一行。