为游标构造 SQL 语句

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

SQL Server Native Client ODBC 驱动程序使用服务器游标来实现 ODBC 规范中定义的游标功能。 ODBC 应用程序通过使用 SQLSetStmtAttr 设置不同的语句属性来控制游标行为。 以下为属性及其默认值。

属性 默认
SQL_ATTR_CONCURRENCY SQL_CONCUR_READ_ONLY
SQL_ATTR_CURSOR_TYPE SQL_CURSOR_FORWARD_ONLY
SQL_ATTR_CURSOR_SCROLLABLE SQL_NONSCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITY SQL_UNSPECIFIED
SQL_ATTR_ROW_ARRAY_SIZE 1

当这些选项在执行 SQL 语句时设置为其默认值时,SQL Server Native Client ODBC 驱动程序不使用服务器游标来实现结果集;而是使用默认结果集。 如果在执行 SQL 语句时,这些选项中的任何选项都已从默认值更改,则 SQL Server Native Client ODBC 驱动程序会尝试使用服务器游标来实现结果集。

默认结果集支持所有 Transact-SQL 语句。 对使用默认结果集时可以执行的 SQL 语句类型没有限制。

服务器游标不支持所有 Transact-SQL 语句。 服务器游标不支持生成多个结果集的任何 SQL 语句。

服务器游标不支持以下语句类型:

  • 批处理

    SQL 语句从两个或多个单独的 SQL SELECT 语句中生成,例如:

    SELECT * FROM Authors; SELECT * FROM Titles  
    
  • 带有多个 SELECT 语句的存储过程

    执行包含多个 SELECT 语句的存储过程的 SQL 语句。 这包括填充参数或变量的 SELECT 语句。

  • 关键字

    包含关键字 FOR BROWSE 或 INTO 的 SQL 语句。

在 SQL Server 中,如果使用服务器游标执行与上述任一条件匹配的 SQL 语句,则服务器游标将隐式转换为默认结果集。 SQLExecDirectSQLExecute 返回SQL_SUCCESS_WITH_INFO后,游标属性将重新设置为其默认设置。

不适合以上类别的 SQL 语句可以通过任何语句属性设置执行,它们通过默认结果集或服务器游标均可正常执行。

错误

在 SQL Server 7.0 及更高版本中,尝试执行生成多个结果集的语句将生成SQL_SUCCESS_WITH INFO 和以下消息:

SqlState: 01S02"  
pfNative: 0  
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]  
               Cursor type changed."  

接收此消息的 ODBC 应用程序可以调用 SQLGetStmtAttr 来确定当前的游标设置。

使用服务器游标时尝试执行带有多个 SELECT 语句的过程将产生下列错误:

SqlState: 42000  
pfNative: 16937  
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]  
               A server cursor is not allowed on a stored procedure  
               with more than one SELECT statement in it. Use a  
               default result set or client cursor.  

使用服务器游标时尝试执行带有多个 SELECT 语句的批处理将产生下列错误:

SqlState: 42000  
pfNative: 16938  
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]  
               sp_cursoropen. The statement parameter can only  
               be a single SELECT statement or a single stored   
               procedure.  

ODBC 应用程序收到这些错误后,在尝试执行该语句前必须将所有游标语句属性重置为其默认值。

另请参阅

执行查询 (ODBC)