在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量……
T-SQL中游标的生命周期以及实现
在T-SQL中,游标的生命周期由5部分组成
1.定义一个游标
在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度.
游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,
或者仅仅是指向特定的行,所以游标是定义 在以Select开始的数据集上的:
--游标(用来存储多条查询数据的一种数据结构(结果集),它有一个指针,用来从上往下移动,从而达到遍历每条记录的作用)
下面仔细讲一下如何定义游标:
游标分为游标类型和游标变量,
对于游标变量来说,遵循T-SQL变量的定义方法(啥,不知道T-SQL变量定义的规则?参考我前面的博文).
游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,
定义时赋值
declare TestCursor Cursor for --Cursor(克瑟) select * from MvcUsers
--先定义后赋值
declare @TestCursors cursor set @TestCursors=cursor for select * from MvcUsers
====================================
-- LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见,
--而GLOBAL意味着游标对于特定连接作为上下文,全局内有效,例如:
declare test_cursor cursor global for--//global 全局变量,在此处理结束后依然有效,默认是global select * from MvcUsers declare test_cursors cursor local for--// 局部游标,在此处理结束后,被隐式释放,无法再其他批出理中调用 select * from MvcUsers --用go执行上面的作用域 go open test_cursor//打开游标 open test_cursors--//关闭游标 close test_cursors
--Forward_Only 和 Scroll 二选一
FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项 而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,
--不加参数,默认Forward_only
---------------------------------------------------------------------------------
declare Test_Cursor cursor for select * from MvcUsers --//默认和forward_only选项,只支持fetch next 选项, --不支持游标向后或者走向特定位置 --加forward only declare Test_Cursor1 cursor forward_only for select * from MvcUsers --加Scroll(“滚动”) declare Test_Cursor2 cursor scroll for--scroll支持游标向任何方向移动 select * from MvcUsers fetch last from Test_Cursor fetch last from Test_Cursor1 fetch last from Test_Cursor2
✪✪✪✪使用游标
declare TestCursor cursor scroll for --必须指定Scroll,否则只支持next只进选项 select name from MvcUsers--这里就是将name的结果集存在了TestCursor这个游标“容器”里了 open TestCursor declare @c varchar(20) --读取下一行 Fetch next from TestCursor into @c-----这里就类比一个For循环进行把TestCursor的数据集一个个取出来~ print @c------------------------------------- --读取最后一行 Fetch last from TestCursor into @c print @c --读取第一行 Fetch first from TestCursor into @c print @c --读取上一行 Fetch Prior from TestCursor into @c print @c --读取第3行 Fetch absolute 3 from TestCursor into @c print @c --读取相对目前来说上一行 Fetch relative -1 from TestCursor into @c print @c
转自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html