举例:


Declare  company_crsr cursor
For select name,salary from company where salary>2000
For update of name,salary


  上面我们声明了一个名为company_crsr的游标。

  (2)打开游标

  open的语法为:

  open 游标名

  在声明游标后,必须打开它以便用fetch,update,delete读取、修改、删除行。在打开一个游标后,它将被放在游标结果集的首行前,必须用fetch语句访问该首行。

  (3)读取游标数据

  在声明并打开一个游标后,可用fetch命令从游标结果集中获取数据行。

  Fetch的语法为:

  Fetch [[Next | Prior | First | Last | Absolute{n|@nvar} |Relative {n|@nvar}]

  From]  游标名 [into 变量列表]

  参数说明:

  Next:返回结果集中当前行的下一行,如果该语句是第一次读取结果集中数据则返回的是第一行

  Prior:返回结果集中当前行的上一行,如果该语句是第一次读取结果集中的数据则无记录结果返回并把游标位置设置为第一行。

  First:返回游标第一行;Last:返回游标中的后一行;

  Absolute{n|@nvar}:如果 n 或 @nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。

  RELATIVE {n | @nvar}:如果 n 或 @nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,返回当前行。如果对游标的第一次提取操作时将 FETCH RELATIVE 的 n 或 @nvar 指定为负数或 0,则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。

  举例:


Fetch  next
company_crsr into @name,@salary


  SQL Server在每次读取后返回一个状态值。可用@@sql_status访问该值,下表给出了可能的@@sql_status值及其意义。

  值意义:

  0——Fetch语句成功
  1——Fetch语句导致一错误
  2——结果集没有更多的数据,当前位置位于结果集后一行,而客户对该游标仍发出Fetch语句时。

  若游标是可更新的,可用update和delete语句来更新和删除行。

  删除游标当前行的语法为:

  Delete [from] 表名

  where current of 游标名

  举例:delete from authors where current of authors_crsr

  当游标删除一行后,SQL Server将游标置于被删除行的前一行上。

  更新游标当前行的语法为:

  update 表名

  set column_name1={expression1|NULL|(select_statement)}

  [,column_name2={expression2|NULL|(select_statement)}

  [……]

  where current of 游标名

  举例:

  update company

  set name=”张三”,salary=”5000”

  where current of company_crsr

  (4)关闭游标

  当结束一个游标结果集时,可用close关闭。该语法为:

  close 游标名

  关闭游标并不改变其定义,可用open再次打开。若想放弃游标,必须使用deallocate释放它,deallocater的语法为:

  deallocater cursor 游标名

  deallocater语句通知SQL Server释放Declare语句使用的共享内存,不再允许另一进程在其上执行Open操作。