为游标构造 SQL 语句

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 语句。

  • 关键字

    包含关键字 COMPUTE、COMPUTE BY、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.

使用服务器游标时尝试执行包含 COMPUTE 子句的 SELECT 语句将产生下列错误:

SqlState: 42000
pfNative: 16907
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
               'COMPUTE' is not allowed in cursor statements.

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

请参阅

概念