为游标构造 SQL 语句
SQL Server Native Client ODBC 驱动程序使用服务器游标来实现 ODBC 规范中定义的游标功能。 ODBC 应用程序通过使用 SQLSetStmtAttr 设置不同的语句属性来控制游标行为。 以下为属性及其默认值。
Attribute | 默认 |
---|---|
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 语句,则服务器游标将隐式转换为默认结果集。 在 SQLExecDirect 或 SQLExecute 返回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 应用程序收到这些错误后,在尝试执行该语句前必须将所有游标语句属性重置为其默认值。