游标主要由结果集合游标位置组成的,结果集是 SELECT 语句
执行后返回的,而游标位置是指向返回结果集中的指针;
使用游标前必须对游标进行声明;
在 SQL Server 数据库中,使用 DECLARE CURSOR 语句
对游标进行声明;
游标的声明要对游标的滚动行为、游标所操作的结果集进行设置;
游标的声明语法格式如下:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FRO select_seatement [ FRO UPDATE [ OF column_name [,..n] ] ]
注意: 若 GROBAL 和 LOCAL
参数都未指定,默认值就由 default to local cursor 数据选项的设置控制;
例子1:声明名称为 cursor_B 的标准游标,如下所示:
declare cursor_B cursorfor select * from B
上述定义了一个名为 cursor_B 的游标,游标所操作的结果集从 SELECT 语句中得到;
例子2:声明名称为 cursor_B_read de 的只读游标,如下所示:
declare cursor_B_read cursor for select * from B for read only
上述代码中与标准的定义游标过程相比多出了 FOR READ ONLY 语句
,表名该游标的记录只能被读取,不能进行被读取,不能进行更改;
例子3:声明名称称为 curesor_B_update 的更改标签,如下所示:
declare cursor_B_update cursor for select * from B for update
使用 OPEN 语句
打开 Transa-SQL 服务器游标,执行 OPEN 语句
的过程,按照 SELECT 语句
填充数据,当打开游标时,游标的位置在数据集的第一行,打开游标的语法格式如下:
OPEN [GLOBAL] cursor_name | cursor_variable _name
例子1:打开游标 cursor_B,如下所示:
open cursor_B
打开游标后,可进行数据操作;
打开全局游标:
open global cursor_B
打开游标是对数据库进行一些 SQL SELECT 的操作,将耗费一段时间,取决于使用的系统性能和这条语句的复杂性;
打开游标后就能读取数据集中的记录,用 FETCH 语句
能对数据集总的数据进行某一行读取;
FETCH 语法的格式如下:
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE {n | @nvar} | relative {n | @nvar} ] FROM ] {{ [ GLOBAL ] cursor_name } | @cursor_variable_name } { INTO @variable_name [,...n] }
例子 1:利用之前创建的游标 cursor_B_read 检索 B表中的记录
declare cursor_B_read cursor for select * from B open cursor_B_read fetch next from cursor_B_read while @@FETCH_STATUS = 0 begin fetch next from cursor_B_read end
在使用游标对数据进行读取时可声明一个游标变量,使用关键字 SET
对游标进行赋值;
对游标赋值的操作步骤:先创建一个游标,打开后将值赋予变量,最后通过 FETCH 语句
从变量中读取值;
例子 2:创建 cursor_S 游标,并将值赋予 @Mchr 游标变量
declare @Mchr cursor declare cursor_S cursor for select * from s; open cursor_S set @Mchr = cursor_S fetch next from @Mchr while @@FETCH_STATUS = 0 begin fetch next from @Mchr end close @Mchr deallocate @Mchr
先声明了游标变量 @Mchr,再创建一个 cursor_S 游标打开游标后将值赋给 @Mchr,最后用 FEECH 读取变量中的数据内容;
FETCH 语法
是游标使用的核心,使用游标能逐条记录到查询结果;已经声明并打开一个游标后,就能将数据放入任意的变量中;
在 FETCH 语句中,读者能指定游标的名称和目标的变量名称;
注意: 若在 SELECT 语句
中使用了 DISTINCT、UNION、GROUP BY 语句
,且在选择中包含了聚合表达式,游标就自动为 INSENSITIVE
的游标;
SQL Server 数据库在创建一个游标后,数据库服务器会开辟一片存储空间用于存放游标返回的数据集;在游标使用完后一定要养成关闭游标的习惯,这样就能释放服务器为游标开辟的内存空间;
在处理完游标中的数据之后,用 CLOSE 命令能关闭一个已打开的游标;
语法格式如下:
CLOSE [ CLOBAL ] cursor_name | cursor_variable_naem
例子1:关闭名称为 cursor_B 的游标
close cursor_B
游标可应用在存储过程、触发器等中,若在声明游标上与释放游标之间使用了事务结构,在结束事务时游标就会自动关闭;
具体步骤如下:
BEGIN TRANSATION
;COMMIT TRANSATION
;注意: 打开游标后,SQL Server 服务器会专门为游标开辟一定的内存空间用于存放游标操作的数据结果集,同时游标的使用也会根据具体情况对某些数据进行封锁;
所以在不使用游标时一定要关闭游标,以通知服务器释放游标所占用的资源;
关闭游标后,可再次打开游标,在一个批处理中,也能多次打开和关闭游标;
当用户确定某个游标不再使用时,应当即使使用 DEALLOCATE 命令释放游标,SQL Server 将删除这个游标的数据结构;
语法如下所示:
DEALLOCATE [GLOBAL]
游标被释放后据不能再使用 OPEN 命令
再次打开了;
关闭游标和释放游标的区别在于,关闭没有把游标运行所占用的内存空间释放,若再次打开游标,还能照常使用,若是释放,就是将游标占用的资源释放;若再想使用游标,就必须重新建立;
到此这篇关于SQL Server数据库游标的基本操作指南的文章就介绍到这了,更多相关SQLServer游标基本操作内容请搜索插件窝以前的文章或继续浏览下面的相关文章希望大家以后多多支持插件窝!