处理结果 (ODBC)

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

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

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

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

Transact-SQL 包括 SET NOCOUNT 语句。 设置 NOCOUNT 选项后,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

  • 打印

  • RAISERROR

SQL Server Native Client ODBC 驱动程序在 RAISERROR 上返回SQL_ERROR,其严重性为 11 或更高。 如果 RAISERROR 的严重性为 19 或更高版本,则也会删除连接。

若要处理 SQL 语句的结果集,应用程序:

  • 确定结果集的特征。

  • 将列绑定到程序变量。

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

  • 测试以确定是否有更多结果集,如果是,则循环回到确定新结果集的特征。

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

本节中

另请参阅

SQL Server Native Client (ODBC)
处理结果作方法主题 (ODBC)