适用范围: SQL Server

打开游标。 sp_cursoropen 定义与游标和游标选项关联的 SQL 语句,然后填充游标。 sp_cursoropen 等效于 Transact-SQL 语句 DECLARE_CURSOR OPEN . 此过程通过在表格数据流 (TDS) 数据包中指定 ID = 2 来调用。

Transact-SQL 语法约定

sp_cursoropen cursor OUTPUT
    , stmt
    [ , scrollopt [ OUTPUT ]
    [ , ccopt [ OUTPUT ]
    [ , rowcount OUTPUT [ , boundparam ] [ , ...n ] ] ] ]
[ ; ]

cursor

SQL Server 生成的游标标识符。 游标handle 必须在涉及游标的所有后续过程中提供的值,例如 sp_cursorfetch游标参数为 int,不能NULL为 。

游标 允许多个游标在单个数据库连接上处于活动状态。

定义游标结果集的必需参数。 任何字符串类型(无论 Unicode、size 等)的任何有效查询字符串(语法和绑定)都可以用作有效的 stmt 值类型。

scrollopt

滚动选项。 scrollopt 参数为 int,默认值NULL为 ,可以是下列值之一。

boundparam

表示使用额外参数。 boundparam 是一个可选参数,如果 scrollopt PARAMETERIZED_STMT 值设置为 ON,则应指定此参数。

返回代码值

如果未引发错误, sp_cursoropen 则返回以下值之一。

sp_cursoropen如果过程成功执行,则发送具有 TDS 列格式信息(0xa0和消息)的 RPC 返回参数和0xa1结果集。 如果不成功,则发送一条或多条 TDS 错误消息。 在任一情况下,都未返回行数据,消息 DONE 计数为 00x81 返回 standard for SELECT 语句0xa5 > 和 0xa4 标记流。

stmt 参数

如果 stmt 指定存储过程的执行,则输入参数可以定义为常量作为 stmt 字符串的一部分,或指定为 boundparam 参数。 通过此方法,可以将声明的变量作为绑定参数传递。

stmt 参数的允许内容取决于 ccopt ALLOW_DIRECT 返回值是否链接到 OR ccopt 值的其余部分:

  • ALLOW_DIRECT如果未指定,则必须使用对包含单个SELECT语句的存储过程调用的 Transact-SQL SELECTEXECUTE语句。 此外,语句 SELECT 必须限定为游标;也就是说,它不能包含关键字 SELECT INTOFOR BROWSE

  • 如果 ALLOW_DIRECT 已指定,则可能会导致一个或多个 Transact-SQL 语句,包括使用多个语句执行其他存储过程的语句。 SELECT非语句或任何SELECT包含关键字SELECT INTOFOR BROWSE执行的语句,并且不会导致创建游标。 对于包含在一批多个语句中的任何 SELECT 语句也是如此。 SELECT如果语句包含仅适用于游标的子句,则忽略这些子句。 例如,当 ccopt 的值0x2002时,这是请求:

  • 如果只有一个 SELECT 语句限定为游标,则具有滚动锁的游标,或者

  • 如果有多个语句、单个非SELECT 语句或 SELECT 不限定为游标的语句,则直接执行语句。

    scrollopt 参数

    前五个滚动值(KEYSEY、、DYNAMICFORWARD_ONLYSTATICFAST_FORWARD)互斥。

    PARAMETERIZED_STMT 可以 CHECK_ACCEPTED_TYPES 链接到 OR 前五个值中的任何一个。

    AUTO_FETCHAUTO_CLOSE 可链接到 OR FAST_FORWARD

    ON如果是CHECK_ACCEPTED_TYPES,则最后五个滚动值(KEYSET_ACCEPTABLE、、FORWARD_ONLY_ACCEPTABLEDYNAMIC_ACCEPTABLESTATIC_ACCEPTABLEFAST_FORWARD_ACCEPTABLE)中至少必须有ON一个。

    STATIC 游标始终以 READ_ONLY. 这意味着无法通过此游标更新基础表。

    ccopt 参数

    前四 个 ccopt 值(READ_ONLYSCROLL_LOCKS两个 OPTIMISTIC 值)互斥。

    选择前四 个 ccopt 值之一决定了游标是只读的,还是使用锁定或乐观方法来防止更新丢失。 如果未指定 ccopt 值,则默认值为 OPTIMISTIC

    ALLOW_DIRECT 可以通过 CHECK_ACCEPTED_TYPES 前四个值中的任何一个链接 OR

    UPDT_IN_PLACE可以链接到ORREAD_ONLYSCROLL_LOCKS之一或值之OPTIMISTIC一。

    ON如果是CHECK_ACCEPTED_TYPES,则最后四个 ccopt 值(READ_ONLY_ACCEPTABLESCROLL_LOCKS_ACCEPTABLE和其中一个OPTIMISTIC_ACCEPTABLE值)中至少有一个也必须为 ON。

    UPDATE定位和DELETE函数只能在提取缓冲区内执行,并且仅当 ccopt 值等于SCROLL_LOCKSOPTIMISTIC。 如果 SCROLL_LOCKS 为指定值,则保证操作成功。 如果 OPTIMISTIC 为指定值,则如果自上次提取以来行发生更改,则操作将失败。

    此失败的原因是,当指定值时 OPTIMISTIC ,通过比较时间戳或校验和值(由 SQL Server 确定)来执行乐观货币控制函数。 如果这些行中的任何一行不匹配,操作将失败。

    指定 UPDT_IN_PLACE 为返回值可控制以下结果:

  • 如果在对具有唯一索引的表执行定位更新时未设置,游标会从其工作表中删除该行,并将其插入游标使用的任何键列的末尾,这会更改这些列。

  • 如果设置 ON,游标将更新工作表中原始行中的键列。

    bound_param参数

    根据代码中的错误消息,参数名称在指定时PARAMETERIZED_STMT为 paramdefPARAMETERIZED_STMT如果未指定,错误消息中未指定任何名称。

    RPC 注意事项

    RPC RETURN_METADATA 输入标志可以设置为 0x0001 请求在 TDS 流中返回游标选择列表元数据。

    A. bound_param参数

    第五个参数之后的任何参数都将作为输入参数传递到语句计划。 第一个此类参数必须是以下形式的字符串:

    <parameter_name> <data_type> [ ,... n ]
    

    后续参数用于传递要替换为 <parameter_name> 语句中的值。

  • sp_cursorfetch (Transact-SQL)
  • 系统存储过程 (Transact-SQL)
  •