游标
游标
1、游标是一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,处理由客户端发送给服务端的sql语句,或是批处理、存储过程、触发器中的数据处理请求。游标的优点在于它可以定位到结果集中的某一行,并可以对该行数据执行特定操作。一个完整的游标由5部分组成:
(1)声明游标 (2)打开游标 (3)从一个游标中查找信息 (4)关闭游标 (5)释放游标
2、在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源还有更多的代码量。可是为什么学习游标呢?
1 现存系统有一些游标,我们查询必须通过游标来实现
2 作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式仍然无法实现某些查询的时候用游标来实现。
3、声明游标语法
declare cursor_name [global/local] cursor for
select * from table1
go
全局游标global在批处理结束后依然有效,局部游标local在批处理结束后被隐式释放,无法在其他批处理中调用,默认是global
4、forword_only 和scroll 二选一 默认是forword_only
declare test_cursorname cursor forword_only for
select * from table1
go
open test_cursorname
fetch next from test_cursorname
默认和forword_only 只支持fetch next选项,不支持游标向后或者走向特定位置
declare test_cursorname2 cursor scoll for
select * from table1
go
open test_cursorname
fetch next from test_cursorname2
fetch last from test_cursorname2
first:取第一行数据
last: 取最后一行数据
prior:取前一行数据
next: 取后一行数据
relative: 按相对位置取数据
absolute:按绝对位置取数据 fetch absolute 3 from TestCursor4 相对于本行向后数三行,比如现在id1,执行完成id是4
5、static keyset dynamic 和 fast_forward 四选一
这四个关键字是游标所在数据集所反应的表内数据和游标读取出的数据的关系
static 意味着,当游标被建立时,将会创建FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不会影响到游标的内容.
dynamic是和STATIC完全相反的选项,当底层数据库更改时,游标的内容也随之得到反映,在下一次fetch中,数据内容会随之改变
keyset 可以理解为介于static和dynamic的折中方案。将游标所在结果集的唯一能确定每一行的主键存入tempdb,当结果集中任何行改变或者删除时,@@fetch_status会为-2,keyset无法探测新加入的数据
fast_forward可以理解成forward_only的优化版本.forward_only执行的是静态计划,而fast_forward是根据情况进行选择采用动态计划还是静态计划,大多数情况下fast_forward要比
forward_only性能略好.
6、read_only scroll_locks optimistic 三选一
read_only 意味着声明的游标只能读取数据,游标不能做任何更新操作
scroll_locks是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功
optimistic是相对比较好的一个选择,optimistic 锁定任何数据,当需要在游标中更新数据时,如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新
二、 打开游标
open test_cursor 注意当全局游标和局部游标变量重名时,默认会打开局部变量游标
三、使用游标
游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的,例如:
@@fetch_status 是一个全局变量
返回上一次使用游标fetch操作所返回的状态值
0 fetch语句成功
-1 fetch语句失败或者此行不在结果集中
-2 被提取的行不存在
四、关闭游标
close+游标名称
五、释放游标
deallocate+游标名称
本文来自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
参考书籍:sqlserver 从入门到精通