SQL之游标

在性能上,游标会吃更多的内存减少可用的并发占用宽带,锁定资源,当然还有更多的代码量…… 

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

原文地址:https://www.cnblogs.com/ZkbFighting/p/7588441.html