在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度.
游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,或者仅仅是指向特定的行,所以游标是定义在以Select开始的数据集上的。
T-SQL中的游标定义在MSDN中如下: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;]
看起来很让人头痛是吧.下面仔细讲一下如何定义游标:
游标分为游标类型和游标变量,对于游标变量来说,遵循T-SQL变量的定义方法.
游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,两种定义方式如下:
--定义后直接赋值 declare test_Cursor cursor for select * from tb1 --先定义后赋值 declare @test_Cursor cursor set @test_Cursor = cursor for select * from tb1
下面我们来看游标定义的参数:
当定义完游标后,游标需要打开后使用,只有简单一行代码:
OPEN test_Cursor
注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标
游标的使用分为两部分,一部分是操作游标在数据集内的指向,另一部分是将游标所指向的行的部分或全部内容进行操作
只有支持6种移动选项,分别为到第一行(FIRST),最后一行(LAST),下一行(NEXT),上一行(PRIOR),直接跳到某行(ABSOLUTE(n)),相对于目前跳几行(RELATIVE(n))
declare my_cursor cursor scroll dynamic /*scroll表示可随意移动游标指针(否则只能向前),dynamic表示可以读写游标(否则游标只读)*/ for select [name] from t_msg open my_cursor declare @name sysname fetch next from my_cursor into @name while(@@fetch_status=0) begin print 'UserName: ' + @name --fetch next from my_cursor fetch next from my_cursor into @name end --fetch first from my_cursor into @name print @name /* update 个人资料 set 姓名='zzg' where current of my_cursor */ /* delete from 个人资料 where current of my_cursor */ close my_cursor deallocate my_cursor
CLOSE test_Cursor
当游标不再需要被使用后,释放游标,只需要一行代码:DEALLOCATE+游标名称
DEALLOCATE test_Cursor
转自:(向原作者致敬)
http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
http://blog.csdn.net/feng2375/article/details/2063551