(sqlserver游标.doc
文本预览下载声明
游标—转自熬夜的虫子
概念
简单点说游标的作用就是存储一个结果集,并根据语法将这个结果集的数据逐条处理。
观点
正因为游标可以将结果集一条条取出处理,所以会增加服务器的负担。再者使用游标的效率远远没有使用默认的结果集效率高,在默认结果集中,从客户端发送到服务器的唯一一个数据包是包含需执行语句的数据包。而在使用服务器游标时,每一个FETCH语句都必须从客户端发送到服务器,然后在服务器中将它解析并编译为执行计划。除非要再sqlserver上进行很复杂的数据操作。
基本知识
一. SQL Server 2005 支持两种请求游标的方法
1.Transact-SQL (支持 SQL-92);
2.数据库应用程序编程接口(API)游标函数(ADO、OLE DB、ODBC)应用程序不能混合使用这两种请求游标的方法。ODBC 还支持客户端游标,即在客户 端实现的游标。
二. 游标根据范围可以分成全局游标和局部游标。全局游标可以在整个会话过程中使用,局部游标只能在一个T-SQL批、存储过程或触发器中执行,当执行完毕后局部游标会自动删除。
三. 游标的基本操作,定义游标、打开游标、循环读取游标、关闭游标和删除游标。
语法基础(SQL-92)
以SQL-92方式为例
初始数据PPS_App_Infomation
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DECLARE @Parm01 varchar(100)
DECLARE @Parm02 varchar(100)
DECLARE @Parm03 varchar(100)
DECLARE cur_Pay INSENSITIVE CURSOR FOR
????SELECT GameName,CreateUser,CreateDate FROM [PicPromotion].[dbo].[PPS_App_Infomation]
OPEN cur_Pay
FETCH cur_Pay INTO @Parm01 , @Parm02 , @Parm03
WHILE @@FETCH_STATUS = 0
BEGIN
????WAITFOR DELAY 00:00:01
????PRINT @Parm01+__+@Parm02+__+@Parm03
????FETCH cur_Pay INTO @Parm01 , @Parm02 , @Parm03
END
DEALLOCATE cur_Pay ?其中 cur_Pay为游标名称 INSENSITIVE 用于设置游标是否使用副本 OPEN 打开游标 fetch循环读入游标 DEALLOCATE 删除游标
INSENSITIVE
举个简单的例子 在游标读取过程中 我们将熬夜虫子改成早起虫子看看 是否添加INSENSITIVE 会是什么样的区别
?
前一个有INSENSITIVE 关键字使用数据副本,后一个无INSENSITIVE 是即时数据
游标的敏感性行为定义了对基行(用于建立游标)所做的更新是否对游标可见。敏感性也定义了能否通过游标进行更新。
scroll
我们再来看看scroll关键字
?
1
2
3
4
5
6
7
8
9
10
11 DECLARE @Parm01 varchar(100)
DECLARE @Parm02 varchar(100)
DECLARE @Parm03 varchar(100)
DECLARE cur_Pay INSENSITIVE SCROLL CURSOR FOR
????SELECT GameName,CreateUser,CreateDate FROM [PicPromotion].[dbo].[PPS_App_Infomation]
OPEN cur_Pay
BEGIN???????
????FETCH LAST FROM cur_Pay INTO @Parm01 , @Parm02 , @Parm03?
????PRINT @Parm01+__+@Parm02+__+@Parm03
END
DEALLOCATE cur_Pay 上面的程序是ok的 成功输出? 熬夜虫子__Maoya__06 20 2009? 1:32PM
如果去掉SCROLL关键字会提示
消息 16911,级别 16,状态 1,第 8 行fetch: 提取类型 last 不能与只进游标一起使用。
SCROLL通过Transact-SQL服务器游标检索特定行。如果SCROLL 选项未在SQL-92样式的DECLARE CURSOR语句中指定,则NEXT是唯一受支持的FETCH 选项。如果在SQL-92样式的DECLARE CURSOR语句中指定了SCROLL 选项
显示全部