标签:对组 包括 执行 open oca insert table none fan
引用出处:http://blog.jobbole.com/86774/
查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录。应用程序可以根据需要滚动或浏览其中的数据。
一:认识游标
游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行。用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成新的SQL代码并立即执行或输出。
1.游标的概念
游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中,它们使结果集的内容可用于其它T_SQL语句。
拥有在查看或处理结果集中向前或向后浏览数据的功能。类似与C语言中的指针,它可以指向结果集中的任意位置,当要对结果集进行逐条单独处理时,必须声明一个指向该结果集中的游标变量。
SQL Server 中的数据操作结果都是面向集合的,并没有一种描述表中单一记录的表达形式,除非使用WHERE子句限定查询结果,使用游标可以提供这种功能,并且游标的使用和操作过程更加灵活、高效。
2.游标的优点
SELECT 语句返回的是一个结果集,但有时候应用程序并不总是能对整个结果集进行有效地处理,游标便提供了这样一种机制,它能从包括多条记录的结果集中每次提取一条记录,游标总是与SQL选择语句相关联,由结果集和指向特定记录的游标位置组成。使用游标具有一下优点:
(1).允许程序对由SELECT查询语句返回行集中的每一条数据执行相同或不同的操作,而不是对整个集合执行同一个操作。
(2).提供对基于游标位置中的行进行删除和更新的能力。
(3).游标作为数据库管理系统和应用程序设计之间的桥梁,将两种处理方式连接起来。
3.游标的分类
SQL Server支持3中游标实现:
(1).Transact_SQL游标
基于DECLARE CURSOR 语法,主要用于T_SQL脚本,存储过程和触发器。T_SQL游标在服务器上实现,并由从客户端发送到服务器的T_SQL语句管理,它们还可能包含在批处理,存储过程或触发器中。
(2).应用程序编程接口(API)服务器游标
支持OLE DB和ODBC中的API游标函数,API服务器游标在服务器上实现。每次客户端应用程序调用API游标函数时,SQL Server Native Client OLE DB访问接口或ODBC驱动程序会把请求传输到服务器,以便对API服务器游标进行操作。
(3).客户端游标
由SQL Server Native Client ODBC驱动程序和实现ADO API的DLL在内部实现。客户端游标通过在客户端高速缓存所有结果集中的行来实现。每次客户端应用程序调用API游标函数时,SQL Server Native Client ODBC驱动程序或ADO DLL会对客户端上告诉缓存的结果集中的行执行游标操作。
由于T_SQL游标和服务器游标都在服务器上实现,所以它们统称为服务器游标。
ODBC和ADO定义了 Microsoft SQL Server 支持的4种游标类型,这样就可以为T_SQL游标指定4种游标类型。
SQL Server支持的4种API服务器游标的类型是:
(i).只进游标
只进游标不支持滚动,它只支持游标从头到尾顺序提取。行只在从数据库中提取出来后才能检索。对所有由当前用户发出或由其它用户提交、并影响结果集中的行的INSERT,UPDATE和DELETE语句,其效果在这些行从游标中提取是可见的。
由于游标无法向后滚动,则在提取行后对数据库中的行进行的大多数更改通过游标均不可见。当值用于确定所修改的结果集(例如更新聚集索引涵盖的列)中行的位置时,修改后的值通过游标可见。
(ii).静态游标
SQL Server静态游标始终是只读的。其完整结果集在打开游标时建立在tempdb中,静态游标总是按照打开游标时的原样显示结果集。由于游标无法向后滚动,则在提取行后对数据库中的行进行的大多数更改通过游标均不可见。
游标不反映在数据库中所做的任何影响结果集成员身份的更改,也不反映对组合成结果集的行的列值所做的更改,静态游标不会显示打开游标以后在数据库中新插入的行,即使这些行符合游标SELECT语句的搜索条件。如果组成结果集的行被其它用户更新,则新的数据值不会显示在静态游标中。静态游标会显示打开游标以后从数据中删除的行。静态游标中不反映UPDATE、INSERT或者DELETE操作(除非关闭游标然后重新打开),甚至不反映使用打开游标的同一连接所做的修改。
(iii).由键驱动的游标
该游标中各行的成员身份和顺序是固定的。由键集驱动的游标由一组唯一标识符(键)控制,这组键成为键集。键是根据以唯一方式标识结果集各行的一组列生成的,键集是打开游标时来自符合SELECT语句要求的所有行中的一组键值。由键集驱动的游标对应的键集是打开游标时在tempdb中生成的。
(IV).动态游标
动态游标与静态游标相对。当滚动游标时,动态游标反映结果集中所做的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变。所有用户做的全部UPDATE、INSERT和DELETE语句均通过游标可见。如果使用API函数(如SQLSePos)或T_SQL WHERE CURRENT OF 子句通过游标进行更新,它们将立即可见。在游标外部所做的更新直到提交时才可见,除非将游标的事物隔离级别设为未提交读。
二:SQL SERVER 游标语法
--定义游标变量
DECLARE @ID int
--定义游标
DECLARE @NAME NVARCHAR(50)
--定义名为MyCursor的游标
DECLARE MyCursor
CURSOR FOR SELECT ID,NAME FROM TABLE
--打开一个游标
OPEN MyCursor
--循环一个游标
FETCH NEXT FROM MyCursor INTO @ID,@NAME
WHILE @@FETCH_STATUS =0
BEGIN
--sql代码块
FETCH NEXT FROM MyCursor INTO @ID,@NAME
END
CLOSE MyCursor --关闭游标
DEALLOCATE MyCursor --释放游标
备注:
@@fetch_status是MSSQL的一个全局变量
其值有以下三种,分别表示三种不同含义:【返回类型integer】
- 0 FETCH 语句成功
-1 FETCH 语句失败或此行不在结果集中
-2 被提取的行不存在
标签:对组 包括 执行 open oca insert table none fan
原文地址:https://www.cnblogs.com/suflowers1700218/p/9089747.html