sp_cursor (Transact-SQL)

适用范围:SQL Server

请求定位更新。 此过程对游标的提取缓冲区内的一行或多行执行操作。 sp_cursor 通过在表格数据流(TDS)数据包中指定 ID = 1 来调用。

Transact-SQL 语法约定

语法

sp_cursor cursor , optype , rownum , table
    [ , value [ ...n ] ]
[ ; ]

参数

cursor

游标句柄。 游标参数为 int,不能NULL为 。 此参数是由handle数据库引擎生成的值,由sp_cursoropen过程返回。

optype

指定游标执行的操作的必需参数。 optype 参数需要以下值之一。

名称 描述
0X0001 UPDATE 用于更新提取缓冲区中的一行或多行。 行号中指定的行将重新获取和更新。
0x0002 DELETE 用于删除提取缓冲区中的一行或多个行。 行号中指定的行将重新获取和删除。
0X0004 INSERT 插入数据而不生成 INSERT 语句。
0X0008 REFRESH 用于从基础表重新填充缓冲区,如果由于乐观并发控制或之后 UPDATE的更新或删除失败,则可用于刷新行。
0X10 LOCK 导致在包含指定行的页面上获取更新锁(U)。 此锁与共享锁(S)兼容,但与独占锁(X)或其他更新锁不兼容。 可用于实现短期锁定。
0X20 SETPOSITION 仅在程序要发出后续 DELETEUPDATE 语句时使用。
0X40 ABSOLUTE 只能与 UPDATEDELETE. ABSOLUTE 仅用于 KEYSET 游标(对于游标忽略 DYNAMIC ), STATIC 并且无法更新游标。

注意: 如果在 ABSOLUTE 尚未提取的键集中的行上指定,则操作可能会失败并发检查,并且无法保证返回结果。

rownum

指定游标对、更新或删除操作的提取缓冲区中的哪些行。 此参数不会影响任何 RELATIVENEXTPREVIOUS 提取操作的起点,也不会影响使用的任何 sp_cursor更新或删除。

rownum 是调用 int 输入值的必需参数。

  • 1

    指示提取缓冲区中的第一行。

  • 2, 3, 4, ...n

    表示第二行、第三行和第四行等。

  • 0

    指示提取缓冲区中的所有行。

此参数仅适用于与、DELETEREFRESHLOCK optype 值一起使用UPDATE

table

当游标定义涉及联接或值参数返回不明确列名时,用于标识 optype 适用的表名的名。 如果未指定任何特定表,则默认值为子句中的 FROM 第一个表。 参数是可选的,需要字符串输入值。 字符串可以指定为任何字符或 Unicode 数据类型,也可以指定多部分表名称。

value

用于插入或更新值。 字符串参数仅用于UPDATEINSERT optype 值。 可以将此字符串指定为任何字符或 Unicode 数据类型。

用户可以为值分配参数名称

返回代码值

0(成功)或 1(失败)。

注解

optype 参数

除了与 UPDATEDELETEREFRESHLOCK; ABSOLUTE 或任一或两UPDATEDELETE者的组合SETPOSITION外,optype 值是互斥的。

值的SET子句UPDATE是从值参数构造的

使用 INSERT <optype> 该值的一个好处是,可以避免将非字符数据转换为插入字符格式。 这些值与指定方式 UPDATE相同。 如果不包含任何必需的列,则 INSERT 失败。

  • 该值SETPOSITION不会影响任何PREVIOUSRELATIVENEXT或提取操作的起点,也不会影响使用sp_cursor接口执行的任何更新或删除。 未在提取缓冲区中指定行的任何数字都会导致位置设置为 1该位置,不会返回错误。 执行后SETPOSITION,该位置将一直有效,直到下一sp_cursorfetch个操作、T-SQL FETCH 操作或sp_cursorSETPOSITION操作通过同一游标。 后续 sp_cursorfetch 操作将游标的位置设置为新提取缓冲区中的第一行,而其他游标调用不会影响位置的值。 SETPOSITION可以由OR子句链接,DELETEREFRESHUPDATE也可以LOCK将位置的值设置为上次修改的行。

如果未通过 rownum 参数指定提取缓冲区中的行,则位置设置为 1,且未返回错误。 设置位置后,它将一直有效,直到下一sp_cursorfetch个操作、T-SQL FETCH 操作或sp_cursorSETPOSITION操作在同一游标上执行。

SETPOSITION可以通过子句链接 ORDELETEREFRESHUPDATE也可以LOCK将光标位置设置为上次修改的行。

rownum 参数

如果指定, 行号 参数可以解释为键集中的行号,而不是提取缓冲区中的行号。 用户负责确保维护并发控制。 这意味着对于 SCROLL_LOCKS 游标,必须独立维护给定行的锁(可以通过事务完成)。 对于 OPTIMISTIC 游标,必须先提取该行才能执行此操作。

参数

如果 optype 值是UPDATEINSERT完整更新或插入语句作为值参数提交,则忽略为指定的值。

注意

与视图有关,只能修改一个参与视图的表。 参数列名称必须反映视图中的列名称,但表名可以是基础基表(在这种情况下,替换sp_cursor视图名称)。

value 参数

使用参数部分前面所述的值的规则有两种替代方法:

  1. 对于任何命名参数,可以使用选择列表中列名称前面添加的名称@。 此替代方法的一个优点是,数据转换可能没有必要。

  2. 使用参数提交完整UPDATEINSERT语句,或使用多个参数提交部分UPDATEINSERT语句,数据库引擎然后生成到完整语句中。 有关示例,请参阅 本文后面的“示例” 部分。

示例

备用值参数使用

对于 UPDATE

使用单个参数时, UPDATE 可以使用以下语法提交语句:

[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]

如果 UPDATE <table_name> 指定,则忽略为 参数指定的任何值。

当使用多个参数时,第一个参数必须为采用以下形式的字符串:

[ SET ] <column name> = expression [ , ...n ]

后续参数必须采用以下格式:

<column name> = expression [ , ...n ]

在这种情况下,<table_name>构造的 update 语句是表参数指定或默认的更新语句。

对于 INSERT

使用单个参数时, INSERT 可以使用以下语法提交语句:

[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )

如果 INSERT <table_name> 指定,则忽略为 参数指定的任何值。

当使用多个参数时,第一个参数必须为采用以下形式的字符串:

[ VALUES ] ( <expression> [ , ...n ] )

后续参数必须采用以下形式 expression [ , ...n ]:除非指定了, VALUES 在这种情况下,最后一个表达式后面必须有尾随 ) 。 在这种情况下,<table_name>构造UPDATE语句中的语句是由表参数指定或默认的语句。

注意

可以提交一个参数作为命名参数,例如 @values。 在这种情况下,不能使用其他命名参数。