处理结果 (ODBC)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
应用程序提交 SQL 语句后,SQL Server 会将任何生成的数据作为一个或多个结果集返回。 结果集是一组与查询条件匹配的行和列。 SELECT 语句、目录函数和某些存储过程可产生以表格格式供应用程序使用的结果集。 如果执行的 SQL 语句为存储过程、包含多个命令的批处理或包含关键字的 SELECT 语句,则会有多个要处理的结果集。
ODBC 目录函数也可以检索数据。 例如, SQLColumns 检索有关数据源中的列的数据。 这些结果集可以包含零行或更多行。
其他 SQL 语句(如 GRANT 或 REVOKE)不返回结果集。 对于这些语句,SQLExecute 或 SQLExecDirect 的返回代码通常是该语句成功的唯一指示。
每个 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_SOPT_SS_NOCOUNT_STATUS SQL_NC_OFF时,应用程序不应显示 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 驱动程序在 RAISERROR 上返回SQL_ERROR,其严重性为 11 或更高。 如果 RAISERROR 的严重性级别为 19 或更高,则连接也会断开。
若要处理 SQL 语句的结果集,应用程序:
确定结果集的特征。
将列绑定到程序变量。
检索单个值、整行值或多行值。
进行测试以查看是否存在多个结果集,如果存在,则进行环回以确定新结果集的特征。
从数据源中检索行并将其返回给应用程序的过程称为提取。