处理结果 (ODBC)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

应用程序提交 SQL 语句后,SQL Server以一个或多个结果集的形式返回任何生成的数据。 结果集是一组与查询条件匹配的行和列。 SELECT 语句、目录函数和某些存储过程可产生以表格格式供应用程序使用的结果集。 如果执行的 SQL 语句为存储过程、包含多个命令的批处理或包含关键字的 SELECT 语句,则会有多个要处理的结果集。

ODBC 目录函数也可以检索数据。 例如, SQLColumns 检索有关数据源中列的数据。 这些结果集可以包含零行或更多行。

其他 SQL 语句(如 GRANT 或 REVOKE)不返回结果集。 对于这些语句, SQLExecuteSQLExecDirect 的返回代码通常是该语句成功的唯一指示。

每个 INSERT、UPDATE 和 DELETE 语句均返回一个仅包含受修改影响的行数的结果集。 当应用程序调用 SQLRowCount 时,此计数可用。 ODBC 3。x 应用程序必须调用 SQLRowCount 来检索结果集,或者 调用 SQLMoreResults 来取消它。 当应用程序执行包含多个 INSERT、UPDATE 或 DELETE 语句的批处理或存储过程时,必须使用 SQLRowCountSQLMoreResults 取消每个修改语句的结果集。 通过在批处理或存储过程中包含 SET NOCOUNT ON 语句,可以取消这些计数。

Transact-SQL 包括 SET NOCOUNT 语句。 当 NOCOUNT 选项设置为 on 时,SQL Server不返回受 语句影响的行计数,SQLRowCount 返回 0。 SQL Server Native Client ODBC 驱动程序版本引入了特定于驱动程序的 SQLGetStmtAttr 选项(SQL_SOPT_SS_NOCOUNT_STATUS)来报告 NOCOUNT 选项是打开还是关闭。 每当 SQLRowCount 返回 0 时,应用程序都应测试SQL_SOPT_SS_NOCOUNT_STATUS。 如果返回SQL_NC_ON,则 SQLRowCount 中的值 0 仅指示SQL Server未返回行计数。 如果返回SQL_NC_OFF,则表示 NOCOUNT 已关闭, 并且 SQLRowCount 的值为 0 表示语句不会影响任何行。 SQL_NC_OFF SQL_SOPT_SS_NOCOUNT_STATUS时,应用程序不应显示 SQLRowCount 的值。 大型批处理或存储过程可能包含多个 SET NOCOUNT 语句,因此程序员不能假定 SQL_SOPT_SS_NOCOUNT_STATUS 保持不变。 每次 SQLRowCount 返回 0 时,都应测试选项。

有若干其他 Transact-SQL 语句在消息中而不是在结果集中返回它们的值。 当SQL Server Native Client ODBC 驱动程序收到这些消息时,它将返回SQL_SUCCESS_WITH_INFO,让应用程序知道信息性消息可用。 然后,应用程序可以调用 SQLGetDiagRec 来检索这些消息。 以这种方式工作的 Transact-SQL 语句包括:

  • DBCC

  • SET SHOWPLAN(在早期版本的 SQL Server 中提供)

  • SET STATISTICS

  • PRINT

  • RAISERROR

SQL Server Native Client ODBC 驱动程序在严重性为 11 或更高的 RAISERROR 上返回SQL_ERROR。 如果 RAISERROR 的严重性级别为 19 或更高,则连接也会断开。

为了处理 SQL 语句产生的结果集,应用程序会执行以下操作:

  • 确定结果集的特征。

  • 将列绑定到程序变量。

  • 检索单个值、整行值或多行值。

  • 进行测试以查看是否存在多个结果集,如果存在,则进行环回以确定新结果集的特征。

从数据源中检索行并将其返回给应用程序的过程称为提取。

本节内容

另请参阅

SQL Server Native Client (ODBC)
处理结果操作指南主题 (ODBC)