大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说SQL 游标(数据库 游标)[亲测有效],希望您对编程的造诣更进一步.
游标的应用
查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录。应用程序可以根据需要滚动或者浏览其中的数据。
游标的定义
游标是一种数据访问机制,一种处理数据的方法,它允许用户访问单独的数据行。主要用于存储过程、触发器和Transac-SQL脚本中,他们使结果集的内容可用于其他Transac-SQL语句。在查看或处理结果集中的数据时,游标可以提供在结果集中向前或者向后浏览数据的功能。类似于C语言中的指针,他可以指向结果集中的任意位置。当要对结果集进行逐行单独处理时,必须声明一个指向该结果集的游标变量。
Sql Server中的数据操作结果都是面向集合的,并没有一种描述biao单一记录的表达形式。
游标的优点
1.用户可以对每一行进行单独处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成SQL代码并立即执行或输出。
2.允许程序对有select查询语句返回的行集中地每行执行相同或不同的操作,而不是对整个集合执行同一个操作。
3.提供对基于游标位置的表中的行进行删除和更新的能力。
4.游标作为数据库管理系统和应用程序设计之间的桥梁,将两种处理方式连接起来。
游标类型
1.Transac-SQL游标
基于declare cursor语法,主要用于Transact-SQL脚本、存储过程和触发器。Transact-SQL游标在服务器上实现,并由从客户端发送到服务器的Transact-SQL语句管理。他们还可能包含在批处理、存储古城或触发器中。
2.应用程序编程接口(API)服务器游标
支持OLEDB和ODBC中的API游标函数,API服务器游标在服务器上实现。每次客户端应用程序调用API游标函数时,SQL Server Native ClientOLEDB 访问接口或者ODBC驱动程序会把请求传输到服务器,以便对API服务器游标进行操作。
3.客户端游标
由SQL Server Native Client ODBC 驱动程序和实现ADO API 的DLL在内部实现。 客户端游标通过在客户端高速缓存所有结果集中的行来实现。每次客户端应用程序调用API游标函数时,SQL Server Native Client ODBC驱动程序 或ADO DLL 会对客户端上高速缓存的结果集中的行执行游标操作。
由于Transact-SQL游标和API服务器游标都在服务器上实现,所以他们统称为服务器游标。ODBC 和ADO 定义了Microsoft SQL Server 支持的4种游标类型。
SQL Server 支持的4种API服务器游标类型
1.只进游标
只进游标不支持滚动,他只支持游标从头到尾顺序提取。由于游标无法向后滚动,因此在提取行后对数据库中的行进行的大多数更改通过游标均不可见。
2.静态游标
SQL Server 静态游标始终是只读的。其完整结果集在打开游标时建立在tempdb中。静态游标总是按照打开游标时的原样显示结果集。
3.由键集驱动的游标
该游标中各行的成员身份和顺序是固定的。由键集驱动的游标由一组唯一标识符(键)控制,这组键成为键集。键是根据以唯一方式标识结果集中各行的一组列生成的。键集是打开游标时来自负荷select语句要求的所有行中的一组键值。由键集驱动的游标对应的键集是打开该游标时在tempdb中生成的。
4.动态游标
动态游标与静态游标相对。当滚动游标时,动态游标反映结果集中所做的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变。所有用户做的全部update、insert和delete语句均通过游标可见。如果API函数(如SQLSetPos)或者Transact-SQL where current of 子句通过游标进行更新,他们将立即可见。在游标外部所做的更新知道提交时才可见,除非将游标的事务隔离级别设置为未提交读。
声明游标
游标主要包括游标结果集和游标位置两部分,游标结果集是由定义游标的select语句返回的行集合,游标位置则是指向这个结果集中的某一行的指针。
语法格式:
declare cursor_name cursor [ local | global ] [ forward_only | scroll ] [ static | keyset | dynamic | fast_forward ] [ read_only | scroll_locks | optimistic ] [ type_warning ] for select_statement [ for update [ of column_name [ ,...n ] ] ]
注:
- cursor_name: 是所定义的Transact-SQL 服务器游标的名称。
- Local:对于其中创建的批处理、存储过程或触发器来说,该游标的作用域是局部的。[Local | Global]:默认为local。
- Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
- Forward_Only:指定游标智能从第一行滚到最后一行。Fetch Next是唯一支持的提取选项。如果在指定Forward_Only是不指定Static、KeySet、Dynamic关键字,默认为Dynamic游标。如果Forward_Only和Scroll没有指定,Static、KeySet、Dynamic游标默认为Scroll,Fast_Forward默认为Forward_Only
- Static:静态游标
- KeySet:键集游标
- Dynamic:动态游标,不支持Absolute提取选项
- Fast_Forward:指定启用了性能优化的Forward_Only、Read_Only游标。如果指定啦Scroll或For_Update,就不能指定他啦。
- Read_Only:不能通过游标对数据进行删改。
- Scroll_Locks:将行读入游标是,锁定这些行,确保删除或更新一定会成功。如果指定啦Fast_Forward或Static,就不能指定他啦。
- Optimistic:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。如果已修改改行,则尝试进行的定位更新或删除将失败。如果指定啦Fast_Forward,则不能指定他。
- Type_Warning:指定将游标从所请求的类型隐式转换为另一种类型时向客户端发送警告信息。
- select_statement: 是定义游标结果集的标准select语句。
- For Update[of column_name ,….] :定义游标中可更新的列。
声明静态游标
--声明静态游标 use TestSchool go declare cursor_Adress cursor for select Id,PCity ,Pcode from Adress;
声明动态游标
--声明动态游标 declare TestData_cursor cursor local scroll Dynamic read_only for select Value from TestData where Id=111;
打开游标
语法:
open [ Global ] cursor_name | cursor_variable_name
注:
- Global:指定cursor_name是全局游标。
- cursor_name:已声明的游标名称。
- cursor_variable_name:游标变量的名称,该变量引用一个游标。
打开静态游标cursor_Adress
--打开静态游标cursor_Adress use TestSchool; go open cursor_Adress;
打开动态游标cursor_TestData
--打开动态游标cursor_TestData use TestSchool; go open TestData_cursor;
读取游标中的数据
fetch命令可以读取游标中的某一行数据。
fetch语法:
Fetch [ [ Next | prior | Frist | Last | Absoute {n | @nvar } | Relative {n | @nvar }] from ] { { [ Global ] cursor_name } | @cursor_variable_name } [ into @variable_name [,....] ]
注:
- Frist:结果集的第一行
- Prior:当前位置的上一行
- Next:当前位置的下一行
- Last:最后一行
- Absoute { n | @nvar }:从游标的第一行开始数,第n行。
- Relative {n | @nvar} :从当前位置数,第n行。
- Into @variable_name[,…] : 将提取到的数据存放到变量variable_name中。
检索Adress表中数据
--检索Adress表中的记录。 use TestSchool; Go fetch next from cursor_Adress while @@FETCH_STATUS =0 --提取成功,进行下一条数据的提取操作 begin fetch next from cursor_Adress end
取数据:
fetch next from cursor_Adress fetch next from cursor_Adress select * from Adress where Id=25
关闭游标
游标打开后,服务器会专门为游标分配一定的内存空间存放游标操作的数据结果集,同时使用游标也会对某些数据进行封锁。所以游标一旦用过,应及时关闭,避免服务器资源浪费。
语法:
close [ Global ] cursor_name | cursor_variable_name
注:
- Global:指定cursor_name是全局游标。
- cursor_name:已声明的游标名称。
- cursor_variable_name:游标变量的名称,该变量引用一个游标。
关闭游标实例:
close cursor_Adress;
释放游标(删除游标)
游标操作的结果集控件虽然被释放了,但是游标结构本身也会占用一定的计算机资源,所以在使用完游标之后,为了收回被游标占用的资源,应该将游标释放。
语法:
--释放游标语法 deallocate [ Global ] cursor_name | cursor_variable_name
释放游标实例:
--释放游标 deallocate cursor_Adress; deallocate cursor_TestData;
游标的使用步骤
- 声明游标变量
- 创建游标
- 打开游标
- 为游标变量赋值
- 从游标变量中读取值
- 判断fetch语句是否执行成功
- 读取游标变量中的数据
- 关闭游标
- 释放游标
游标实例
--使用游标变量 use TestSchool go declare @varcursor Cursor --声明游标变量declare cursor_Adress cursor for --创建游标 select Id,PCity ,Pcode from Adress; open cursor_Adress; --打开游标 set @varcursor = cursor_Adress --为游标变量赋值 fetch next from @varcursor --从游标变量中读取值 while @@FETCH_STATUS = 0 --判断fetch 语句是否执行成功 begin fetch next from @varcursor --读取游标变量中的数据 end close @varcursor --关闭游标 deallocate @varcursor --释放游标
结果:
本文部分内容参考至网络,如有错误,敬请指正,如有侵权,请联系修改。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/24010.html