SQL Server游标,Cursor

----游标   从某一结果集中逐一的取出数据----
----游标分类:Transact-SQL游标,API游标,客户游标

----游标的生命周期:声明游标,打开游标,读取游标数据,关闭游标,释放游标

----1. 声明游标:是为游标指定获取数据时所使用的Select语句,声明游标并不会检索任何数据
----Declare 游标名称 Cursor 参数

 DECLARE cursor_name CURSOR
 [LOCAL | GLOBAL]
 [FORWARD_ONLY | SCROLL]
 [STATIC | KEYSET | DYNAMIC]
 [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
 FOR select_statement
 [FOR {READ ONLY | UPDATE ][OF column_list]}]
----INSENSITIVE关键字指明要为检索到的结果集建立一个临时拷贝,以后的数据从这个临时拷贝中获取。如果在后来游标处理的过程中,原有基表中数据发生了改变,那么它们对于该游标而言是不可见的。这种不敏感的游标不允许数据更改。
----SCROLL关键字指明游标可以在任意方向上滚动。所有的fetch选项(first、last、next、relative、absolute)都可以在游标中使用。如果忽略该选项,则游标只能向前滚动(next)。
----Select_statement指明SQL语句建立的结果集。Transact SQL语句COMPUTE、COMPUTE BY、FOR BROWSE和INTO在游标声明的选择语句中不允许使用。
----READ ONLY指明在游标结果集中不允许进行数据修改。
----UPDATE关键字指明游标的结果集可以修改。
----OF column_list指明结果集中可以进行修改的列。缺省情况下(使用UPDATE关键字),所有的列都可进行修改。
----LOCAL关键字指明游标是局部的,它只能在它所声明的过程中使用。
----GLOBAL关键字使得游标对于整个连接全局可见。全局的游标在连接激活的任何时候都是可用的。只有当连接结束时,游标才不再可用。
----FORWARD_ONLY指明游标只能向前滚动。
----STATIC的游标与INSENSITIVE的游标是相同的。
----KEYSET指明选取的行的顺序。SQL Server将从结果集中创建一个临时关键字集。如果对数据库的非关键字列进行了修改,则它们对游标是可见的。因为是固定的关键字集合,所以对关键字列进行修改或新插入列是不可见的。
----DYNAMIC指明游标将反映所有对结果集的修改。
----SCROLL_LOCK是为了保证游标操作的成功,而对修改或删除加锁。
----OPTIMISTIC指明哪些通过游标进行的修改或者删除将不会成功。

----标准游标
 Declare MyCursor Cursor
  for Select * from AccountInfo
----只读游标
 Declare MyCursor Cursor
  for Select * from AccountInfo
  for Read Only
----可更新游标
 Declare MyCursor Cursor
  for Select * from AccountInfo
  for update
 
----2. 打开游标:使用Open语句打开Transaction-SQL服务器游标,执行Open语句的过程就是按照Select语句惊醒填充数据
----打开游标以后游标位置在第一行
 Open MyCursor
 
----3. 读取游标数据:在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行,使用Fetch
----操作可以使游标移动到下一条记录,并将游标返回的每个列的数据分别赋值给声明的本地变量
 Fetch [Next|Prior|First|Last|Absolute n|Relative n ] from MyCursor
 into @accountID,@name,@type,@money,@state
----NEXT指明从当前行的下一行取值,若第一次取值则返回第一行。默认读取选项为Next
----PRIOR指明从当前行的前一行取值。
----FIRST是结果集的第一行。
----LAST是结果集的最后一行。
----ABSOLUTE n表示结果集中的第n行,该行数同样可以通过一个局部变量传播。若n为正数,则返回从游标标头开始的第n行,
----并将返回行作为新的当前行;若n为负数,则返回从游标末尾开始的第n行,并将返回行作为新的当前行;如果n为0,则返回当前行。
----RELATIVE n表示要取出的行在当前行的前n行或后n行的位置上。如果该值为正数,则要取出的行在当前行前n行的位置上,
----如果该值为负数,则返回当前行的后n行。
----INTO @cursor_variable_name表示游标列值存储的地方的变量列表。该列表中的变量数应该与DECLARE语句中选择语句
----所使用的变量数相同。变量的数据类型也应该与被选择列的数据类型相同。直到下一次使用FETCH语句之前,变量中的
----值都会一直保持。
----每一次FETCH的执行都存储在系统变量@@fetch_status中。如果FETCH成功,则@@fetch_status被设置成0。
----@@fetch_status为-1表示已经到达了结果集的一部分(例如,在游标被打开之后,基表中的行被删除)。
----@@fetch_status可以用来构造游标处理的循环。


----4. 关闭游标:
 Close MyCursor

----5. 释放游标:
Deallocate MyCursor


----游标使用小例子
declare @ID varchar(20);
declare @name nvarchar(20);
declare @type nvarchar(20);
declare @money nvarchar(20);
declare @state nvarchar(20);
Declare MyCursor Cursor scroll
 for Select * from AccountInfo
open MyCursor
Fetch Next from MyCursor
 into @ID,@name,@type,@money,@state
 
while(@@Fetch_Status=0)
 begin
  --begin
  print @ID+', '+@name+', '+@type+', '+@money+', '+@state
  --end
  Fetch Next from MyCursor
  into @ID,@name,@type,@money,@state
 end

close MyCursor
Deallocate MyCursor


----结果:1, Eva, RMB, 5000.00, Active
----      2, Eva, Dollor, 2000.00, Active

----修改当前游标的数据
Update AccountInfo(tablename) set accountName='Jack'(columnname) Where current of MyCursor

----修改当前游标的数据
Delete from AccountInfo(tablename) Where current of MyCursor

Select @@cursor_rows  ----可以得到当前游标中存在的数据行数
----此变量为一个连接上的全局变量,因此只对应最后一次打开的游标

----参考文章: http://www.cnitblog.com/ffan/archive/2005/10/13/3276.aspx

posted @ 2011-05-18 11:30  eva.xiao  阅读(3303)  评论(0编辑  收藏  举报