sp_cursoropen (Transact-SQL)
打开游标。 sp_cursoropen 定义与游标和游标选项相关联的 SQL 语句,然后填充游标。 sp_cursoropen等效于 Transact-SQL 语句 DECLARE_CURSOR 和 OPEN 的组合。 此过程通过在表格格式数据流 (TDS) 数据包中指定 ID = 2 来调用。
语法
sp_cursoropen cursor OUTPUT, stmt
[, scrollopt [ OUTPUT ] [ , ccopt [ OUTPUT ]
[ ,rowcount OUTPUT [ ,boundparam] [,...n] ] ] ] ]
参数
cursor
SQL Server 生成的游标标识符。 cursor 是一个“句柄”值,必须对涉及游标的所有后续过程(如 sp_cursorfetch)提供此值。 cursor 是一个具有 int 返回值的必需参数。cursor 允许多个游标在单个数据库连接上处于活动状态。
stmt
定义游标结果集的必需参数。 任何字符串类型(无论 Unicode、大小等)的任何有效查询字符串(语法和绑定)都可作为有效的 stmt 值类型。scrollopt
滚动选项。 scrollopt 是一个可选参数,它需要以下 int 输入值之一。值
说明
0x0001
KEYSET
0x0002
DYNAMIC
0x0004
FORWARD_ONLY
0x0008
STATIC
0x10
FAST_FORWARD
0x1000
PARAMETERIZED_STMT
0x2000
AUTO_FETCH
0x4000
AUTO_CLOSE
0x8000
CHECK_ACCEPTED_TYPES
0x10000
KEYSET_ACCEPTABLE
0x20000
DYNAMIC_ACCEPTABLE
0x40000
FORWARD_ONLY_ACCEPTABLE
0x80000
STATIC_ACCEPTABLE
0x100000
FAST_FORWARD_ACCEPTABLE
因为所请求的值可能不适合由 stmt 定义的游标,所以,此参数可同时用作输入和输出。 在此类情况下,SQL Server 分配一个适当的值。
ccopt
并发控制选项。 ccopt 是一个可选参数,它需要以下 int 输入值之一。值
说明
0x0001
READ_ONLY
0x0002
SCROLL_LOCKS(以前称为 LOCKCC)
0x0004
OPTIMISTIC(以前称为 OPTCC)
0x0008
OPTIMISTIC(以前称为 OPTCCVAL)
0x2000
ALLOW_DIRECT
0x4000
UPDT_IN_PLACE
0x8000
CHECK_ACCEPTED_OPTS
0x10000
READ_ONLY_ACCEPTABLE
0x20000
SCROLL_LOCKS_ACCEPTABLE
0x40000
OPTIMISTIC_ACCEPTABLE
0x80000
OPTIMISITC_ACCEPTABLE
借助于 scrollopt,SQL Server 可以覆盖所请求的 ccopt 值。
rowcount
要用于 AUTO_FETCH 的提取缓冲区行数。 默认值为 20 行。 当作为输入值与返回值赋值时,rowcount 的行为有所不同。作为输入值
作为返回值
当指定了 AUTO_FETCH scrollopt 值时,rowcount 表示放入提取缓冲区中的行数。
注意
当指定了 AUTO_FETCH 时,>0 是有效的值,否则将忽略。
表示结果集中的行数,但当指定了 scrollopt AUTO_FETCH 值时除外。
boundparam
指示使用其他参数。 boundparam 是一个可选参数,如果 scrollopt PARAMETERIZED_STMT 值设置为 ON,则应指定此参数。
返回代码值
如果未引发错误,则 sp_cursoropen 返回以下值之一。
0
过程已成功执行。0x0001
在执行过程中发生了错误(次要错误,严重程度不足以在操作中引发错误)。0x0002
正在执行异步操作。0x0002
正在执行 FETCH 操作。A
此游标已由 SQL Server 取消分配而不可用。
当引发错误时,返回值可能不一致,无法确保准确性。
当将 rowcount 参数指定为返回值时,将出现以下结果集。
-1
如果行数未知或不适用,则返回此值。-n
当异步填充生效时,返回此值。 表示当指定了 scrollopt AUTO_FETCH 值时,放入提取缓冲区中的行数。
如果使用 RPC,则返回值如下所示。
0
过程成功。1
过程失败。2
正在异步生成键集游标。16
快进游标已自动关闭。
![]() |
---|
如果成功执行了 sp_cursoropen 过程,则将发送 RPC 返回参数和具有 TDS 列格式信息(0xa0 和 0xa1 消息)的结果集。 如果不成功,则发送一条或多条 TDS 错误消息。 在任一情况下,都不会返回行数据,“已完成”消息计数将为零。 如果您使用的 SQL Server 版本低于 7.0,将返回 0xa0、0xa1(SELECT 语句的标准)以及 0xa5 和 0xa4 标记流。 如果您使用 SQL Server 7.0,将返回 0x81(SELECT 语句的标准)以及 0xa5 和 0xa4 标记流。 |
注释
stmt 参数
如果 stmt 指定执行某个存储过程,则输入参数可能要么定义为常量作为 stmt 字符串的一部分,要么指定为 boundparam 参数。 通过此方法,可以将声明的变量作为绑定参数传递。
stmt 参数允许的内容取决于 ccopt ALLOW_DIRECT 返回值是否已由 OR 链接到 ccopt 值的剩余部分,也即:
如果未指定 ALLOW_DIRECT,则必须对于包含单个 SELECT 语句的存储过程使用 Transact-SQL SELECT 或 EXECUTE 语句调用。 此外,SELECT 语句必须限定为一个游标;也即,它不能包含关键字 SELECT INTO 或 FOR BROWSE。
如果指定了 ALLOW_DIRECT,则这可能导致一个或多个 Transact-SQL 语句,包括那些依次执行其他存储过程以及多个语句的语句。 将只执行非 SELECT 语句或包含关键字 SELECT INTO 或 FOR BROWSE 的任何 SELECT 语句,而不会导致创建游标。 这同样适用于在一批多个语句中包含的任何 SELECT 语句。 在 SELECT 语句包含只与游标相关的子句的情况下,将忽略这些子句。 例如,当 ccopt 的值为 0x2002 时,这是针对以下内容的请求:
具有滚动锁的游标(如果只有一个 SELECT 语句限定为游标),或者
一个直接的语句执行(如果有多个语句、一个非 SELECT 语句或不限定为游标的 SELECT 语句)。
scrollopt 参数
前五个 scrollopt 值(KEYSEY、DYNAMIC、FORWARD_ONLY、STATIC 和 FAST_FORWARD)是互斥的。
PARAMETERIZED_STMT 和 CHECK_ACCEPTED_TYPES 可以由 OR 链接到前五个值中的任何一个。
AUTO_FETCH 和 AUTO_CLOSE 可以由 OR 链接到 FAST_FORWARD。
如果 CHECK_ACCEPTED_TYPES 为 ON,则后五个 scrollopt 值(KEYSET_ACCEPTABLE、DYNAMIC_ACCEPTABLE、FORWARD_ONLY_ACCEPTABLE、STATIC_ACCEPTABLE 或 FAST_FORWARD_ACCEPTABLE)中至少有一个必须也为 ON。
STATIC 游标始终打开为 READ_ONLY。 这意味着无法通过此游标更新基础表。
ccopt 参数
前四个 ccopt 值(READ_ONLY、SCROLL_LOCKS 和两个 OPTIMISTIC 值)是互斥的。
![]() |
---|
选择前四个 ccopt 值之一可指定游标是否为只读的,或者是否使用锁定或乐观方法来防止丢失更新。 如果未指定 ccopt 值,则默认值为 OPTIMISTIC。 |
ALLOW_DIRECT 和 CHECK_ACCEPTED_TYPES 可以由 OR 链接到前四个值中的任何一个。
UPDT_IN_PLACE 可以由 OR 链接到 READ_ONLY、SCROLL_LOCKS 或任一 OPTIMISTIC 值。
如果 CHECK_ACCEPTED_TYPES 为 ON,则后四个 ccopt 值(READ_ONLY_ACCEPTABLE、SCROLL_LOCKS_ACCEPTABLE 和任一 OPTIMISTIC_ACCEPTABLE 值)中至少有一个必须也为 ON。
只能在提取缓冲区内且仅当 ccopt 值等于 SCROLL_LOCKS 或 OPTIMISTIC 时,才可执行定位的 UPDATE 和 DELETE 函数。 如果 SCROLL_LOCKS 是指定的值,则此操作可确保成功。 如果 OPTIMISTIC 是指定的值,则当自上次提取该行后行已发生变化时,操作将失败。
失败原因在于:当 OPTIMISTIC 为指定的值时,将通过比较时间戳或校验和值执行乐观并发控制函数(由 SQL Server 确定)。 如果任何行不匹配,则操作失败。
将 UPDT_IN_PLACE 指定为返回值可控制以下结果:
如果未设置,则当对某个表使用唯一索引执行定位更新时,游标将从其工作表中删除该行,并将其插入到游标使用的任何键列的末尾,从而更改这些列。
如果设置为 ON,游标将只更新工作表的原始行中的键列。
bound_param 参数
根据代码中的错误消息,当指定了 PARAMETERIZED_STMT 时,参数名称应为 paramdef。 当未指定 PARAMETERIZED_STMT 时,在错误消息将不指定任何名称。
RPC 注意事项
RPC RETURN_METADATA 输入标志可设置为 0x0001,以请求在 TDS 流中返回游标选择列表元数据。
示例
bound_param 参数
第五个参数之后的任何参数都将作为输入参数传递到语句计划。 第一个此类参数必须为以下格式的字符串:
{ local variable name data type } [,…n]
后续参数用于传递要用于替代语句中 local variable name 的值。