关系数据库中的操作作用与表中的所有数据行,SELECT语句返回的结果集由满足WHERE子句条件的所有行组成。应用程序并非总是能有效地把整个结果集作为一个单元来处理,他们需要一种机制类每次处理一行或几行,游标(Cursor)正是为结果集提供这种机制的工具。
一.游标概述
游标是一种处理数据的方法,它可以对结果集进行逐行处理,也可以指向结果集中的任意位置,并对该位置的数据进行处理。
1.游标种类
SQL_Server 支持3中类型的游标:Transact-SQL游标、API服务器游标和客户游标。
1)Transact—SQL游标
Transact—SQL游标是由DECLARE CURSOR语句定义,主要用在服务器上,由从客户端发送给服务器的Transact—SQL语句或批处理、存储过程、触发器中的Transact—SQL语句进行管理。Transact—SQL游标不支持提取数据块或多行数据。
2)API游标
API游标支持再OLE DB、ODBC以及DB_library中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API游标函数,SQL Server的OLE DB提供者、ODBC驱动器或DB——library的动态链接库(。dll)都会将这些客户请求送给服务器以对API游标进行处理。
3)客户游标
客户游标当客户机缓存结果集时才使用。在客户游标中,有一个默认的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标。一般情况下,服务器游标能支持绝大多数的游标操作,单不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。
由于API游标和Transact-SQL游标使用在服务器端,所以被称为服务器游标或后台游标,而客户游标被称为前台游标。
2.服务器游标与默认结果集的比较
SQL Server以两种方式为用户返回结果集:默认结果集和服务器游标。
(1)默认结果集具有的特点:开销小;取数据时提供最大性能;仅支持默认的单进、只读游标功能;返回结果行时一次一行;连接时一次只支持一个活动语句;支持所有Travsact-SQL语句。
(2)服务器游标具有的特点:支持所有游标功能;可以为用户返回数据块;在单个连接上支持多个活动语句;以性能补偿游标功能;不支持所有返回多于一行结果集的Transact-SQL语句。
使用游标不如使用默认结果集的效率高。在默认结果集中客户端只想服务器发送要执行的语句。而使用服务器游标时,每个FETCH语句都必须从客户端发往服务器,再在服务器中分析此语句并将它编译为执行计划。
如果一个Transact-SQL语句将返回一个相对小的结果集,此结果集可以存放在内存中共客户端应用程序使用,而且用户事先知道在执行此语句之前必须检索整个结果集,那么就使用默认结果集。只有在需要游标操作以支持应用程序的功能,或者可能只检索一部分结果集时,才使用服务器游标。
3.服务器游标与客户游标的比较
使用服务器游标比使用客户游标有以下几方面的优点。
(1)性能:如果要在游标中访问部分数据,使用服务器游标将提供最佳性能,因为只有被渠道的数据在网络上发送,客户游标在客户端存取所有结果集。
(2)更准确的定位更新:服务器游标直接支持定位操作,如UPDATE 和DELETE语句,客户游标通过产生Transact-SQL搜索UPDATE语句模拟定位游标更新,如果多行与UPDATE语句的WHERE子句的条件相匹配将导致无意义更新。
(3)内存使用:使用服务器游标时,客户端不需要高速存取大量数据或者保持有关游标位置的信息,这些都由服务器类完成。
(4)多活动语句:使用服务器游标时,结果不会存留在游标操作之间的连接上,这就允许同时拥有多个活动的基于游标的语句。
4.服务器游标类型
SQL Server支持4中类型的服务器游标,它们时单进游标、静态游标、动态游标和键集驱动游标。
(1)单进游标只支持游标按从前向后顺序提取数据,游标从数据库中提取一条记录并进行操作,操作完毕后,再提取下一条记录。
(2)静态游标也称为快照