SQL 游标(1)

 

关系数据库中的操作会对整个行集起作用。由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。这种由语句返回的完整行集称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。

游标通过以下方式来扩展结果处理:

  • 允许定位在结果集的特定行。
  • 从结果集的当前位置检索一行或一部分行。
  • 支持对结果集中当前位置的行进行数据修改。
  • 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
  • 提供脚本、存储过程和触发器中用于访问结果集中的数据的 Transact-SQL 语句。

Microsoft SQL Server 2005 支持两种请求游标的方法:

  • Transact-SQL
    Transact-SQL 语言支持使用根据 SQL-92 游标语法制定的游标的语法。
  • 数据库应用程序编程接口(API)游标函数
    SQL Server 支持以下数据库 API 的游标功能:
    • ADO(Microsoft ActiveX 数据对象)
    • OLE DB
    • ODBC(开放式数据库连接)

应用程序不能混合使用这两种请求游标的方法。已经使用 API 指定游标行为的应用程序不能再执行 Transact-SQL DECLARE CURSOR 语句请求一个 Transact-SQL 游标。应用程序只有在将所有的 API 游标特性设置回默认值后,才可以执行 DECLARE CURSOR。

如果既未请求 Transact-SQL 游标也未请求 API 游标,则默认情况下 SQL Server 将向应用程序返回一个完整的结果集,这个结果集称为默认结果集。

Transact-SQL 游标和 API 游标有不同的语法,但下列一般进程将用于所有 SQL Server 游标:

  1. 将游标与 Transact-SQL 语句的结果集相关联,并且定义该游标的特性,例如是否能够更新游标中的行。
  2. 执行 Transact-SQL 语句以填充游标。
  3. 从游标中检索您想要查看的行。从游标中检索一行或一部分行的操作称为提取。执行一系列提取操作以便向前或向后检索行的操作称为滚动。
  4. 根据需要,对游标中当前位置的行执行修改操作(更新或删除)。
  5. 关闭游标。

==================================================================================

默认结果集处理和多个活动的结果集

 

提交要执行的请求后,Microsoft SQL Server 2005 将按以下方式将结果集发送回客户端:

  1. SQL Server 从客户端接收包含要执行的 Transact-SQL 语句或一批 Transact-SQL 语句的网络数据包。
  2. SQL Server 编译并执行该语句或该批语句。
  3. SQL Server 开始将结果集或者来自批处理或存储过程的多个结果集的行放在网络数据包中,然后发送给客户端。SQL Server 在每个数据包中放置尽可能多的结果集行。
  4. 包含结果集行的数据包被缓存在客户端的网络缓冲区中。当客户端应用程序提取这些行时,ODBC 驱动程序或 OLE DB 访问接口从网络缓冲区中提取这些行,然后将数据传输给客户端应用程序。客户端每次向前检索一行结果。

这种返回结果的模式称为默认结果集。

SQL Server 2005 提供了在一个连接下拥有多个活动结果集的功能,这通常称为 MARS。必须为每个连接显式启用此功能。此功能仅在 SQL Native Client ODBC 驱动程序、SQL Native Client OLEDB 访问接口和 .NET Framework 2.0 SqlClient 托管访问接口中提供。

使用连接字符串特性或会话属性为某个特定的会话启用 MARS:

  • 对于 ODBC,应将 SQL_COPT_SS_MARS_ENABLED 设置为 SQL_MARS_ENABLED_YES
  • 对于 OLEDB,应将 SSPROP_INIT_MARSCONNECTION 设置为 VARIANT_TRUE
  • 对于 SqlClient 托管访问接口,必须将连接字符串特性 MultipleActiveResultSets 设置为 True。

MARS 只在连接了 SQL Server 2005 的客户端提供程序中可用。MARS 在早期版本的客户端提供程序或 SQL Server 的任意组合中均不可用。

在早期版本的 SQL Server 或未启用 MARS 的会话中,在应用程序处理 SQL Server 返回的所有行或者向 SQL Server 发送取消其余结果的请求之前,客户端无法通过某个特定的连接发送任何其他请求。必须先处理完所有结果才能通过该连接进行任何更新。

ms187602.note(zh-cn,SQL.90).gif注意:
“消防队游标”是默认结果集以前的叫法,现已不再使用。

 

 

默认结果集是在没有请求游标时 SQL Server 所使用的结果集处理类型。满足下列条件时会出现这种情况:

  • 应用程序没有使用 DECLARE CURSOR 语句请求 Transact-SQL 服务器游标,而是直接执行了 Transact-SQL 语句,例如 SELECT。
  • 如果应用程序使用 ADO、OLE DB 和 ODBC,它将令所有 API 游标特性都使用默认设置,这样就不会请求任何 API 游标。这一默认特性集的目的是请求行集大小为 1 的只进只读游标。
  • 由于这种处理方式是在所有游标特性均设置为默认值以及 SQL Server 或数据库 API 实际并未涉及游标处理的情况下使用,因此被称为默认结果集。

默认结果集不会以一大块的形式提供给应用程序。结果集被缓存在客户端的网络缓冲区内。应用程序每次从结果集中提取一行。每次提取时,OLE DB 访问接口或 ODBC 驱动程序将数据从网络缓冲区的下一行转移到应用程序的变量内。OLE DB、ODBC 和 ADO 应用程序用来检索行的 API 函数与从游标中提取行所用的 API 函数相同。SqlClient 托管访问接口使用 SqlDataReader 类来显示默认结果集。当 MultipleActiveResultSets 设置为 True 时,允许在某个给定的时间打开多个 SqlDataReader。

默认结果集是将结果传输给客户端的最有效的方法。从客户机发送给服务器的唯一数据包就是包含要执行语句的原始数据包。当结果被发送回客户端时,SQL Server 将尽可能多的结果集行放到每个数据包中,以最大程度地减少发送给客户端的数据包数量。

使用默认结果集时,支持所有的 Transact-SQL 语句。使用默认结果集时,还可以执行包含多个语句(这些语句返回结果集)的批处理或存储过程。

默认结果集只能用于将结果集发送回客户端应用程序。默认结果集中的数据对批处理、存储过程或触发器中的任何其他 Transact-SQL 语句或变量都不可用。例如,以存储过程或触发器中的以下语句为例:

SELECT ProductID FROM AdventureWorks.Production.Product;

该语句生成一个默认结果集,其中包含 AdventureWorks 数据库中所有产品的 ID,该结果集被 SQL Server 直接发送给客户端。存储过程或触发器中的所有其他 Transact-SQL 语句或变量都不能引用此产品 ID 列表。若要使此结果集中的数据能够被其他 Transact-SQL 语句使用,必须将数据放在 Transact-SQL 服务器游标中:

DECLARE abc CURSOR FOR
SELECT ProductID FROM AdventureWorks.Production.Product;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光义

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值