SqlServer之游标深入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer之游标深入相关的知识,希望对你有一定的参考价值。
原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-cursor-2/
上一节我们简单讲解了SqlServer的游标的简单创建,本节我们将根据msdn上的创建游标代码来详细讲解游标的创建、以及其特性。
1 DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 2 [ FORWARD_ONLY | SCROLL ] 3 [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 4 [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 5 [ TYPE_WARNING ] 6 FOR select_statement 7 [ FOR UPDATE [ OF column_name [ ,...n ] ] ] 8 [;]
一、创建游标
(a)、LOCAL 和GLOBAL
就像C#或C++等编程语言一样,使用sql语言创建游标也可以创建全局游标和局部游标。Local意味着游标的声明周期在函数获得存储过程中是可用的,Global意味着游标全局有效。如果不指定游标作用域,默认作用域为Global
如下:
1 declare @table Table(Id int) 2 declare @i int=0 3 while @i<100 4 begin 5 insert into @table values(@i) 6 set @i=@i+1; 7 end 8 9 declare My_Cursor1 cursor global for select * from @table 10 declare My_Cursor2 cursor local for select * from @table 11 declare My_Cursor3 cursor for select * from @table 12 13 go 14 open My_Cursor1 15 open My_Cursor2 16 open My_Cursor3
(b)、 FORWARD_ONLY 和 SCROLL
游标是针对数据集的,那么它在读取数据集的时候就有其读取数据的方向。 FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,如下:
1 --不加参数默认为forward_only 2 declare My_Cursor1 cursor for select * from @table 3 declare My_Cursor2 cursor forward_only for select * from @table 4 declare My_Cursor3 cursor scroll for select * from @table 5 6 open My_Cursor1 7 open My_Cursor3 8 open My_Cursor3 9 10 fetch last from My_Cursor1 11 fetch last from My_Cursor2 12 fetch last from My_Cursor3
(c)、[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
至于上面几种情况笔者也不是太了解,就先跳过介绍
二、打开游标
创建完成游标后我们还要打开游标才能正确的使用游标:代码如下:
1 open My_Cursor1 2 open My_Cursor3 3 open My_Cursor3
三、使用游标
使用游标分为两部分:一是操作游标的指向,二是操作游标指向的数据行。
游标支持使用6中指向操作。分别是:第一行(first),最后一行(LAST),下一行(next),上一行(prior),直接跳到某一行(absolute(n)),相对于目前跳几行(relative(n)),代码如下:
1 --指定参数scroll后方可使用6种游标指向参数,对于未指定scroll参数的则默认读取下一行数据 2 declare @id int 3 declare My_Cursor cursor scroll for select * from @table 4 open My_Cursor 5 --指向下一行数据 6 fetch next from My_Cursor into @id 7 --指向上一行数据 8 fetch prior from My_Cursor into @id 9 --指向第一行数据 10 fetch first from My_Cursor into @id 11 --指向最后一行数据 12 fetch last from My_Cursor into @id 13 --直接跳转到某行数据 14 fetch absolute 12 from My_Cursor into @id 15 --相对于目前来说上两行数据 16 fetch relative -2 from My_Cursor into @id
游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的,例如:
1 declare @id int 2 declare My_Cursor cursor scroll for select * from @table 3 open My_Cursor 4 --指向下一行数据 5 fetch next from My_Cursor into @id 6 while @@FETCH_STATUS=0 7 begin 8 select @id 9 End
四、关闭游标
游标使用完后必须要关闭,代码如下:
close My_Cursor
五、释放游标
当游标不再需要被使用后,释放游标。代码如下:
deallocate My_Cursor
以上是关于SqlServer之游标深入的主要内容,如果未能解决你的问题,请参考以下文章