sp_cursor (Transact-SQL)
适用范围:SQL Server
请求定位更新。 此过程对游标的提取缓冲区内的一行或多行执行操作。 sp_cursor
通过在表格数据流(TDS)数据包中指定 ID = 1
来调用。
语法
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 |
仅在程序要发出后续 DELETE 或 UPDATE 语句时使用。 |
0X40 |
ABSOLUTE |
只能与 UPDATE 或 DELETE . ABSOLUTE 仅用于 KEYSET 游标(对于游标忽略 DYNAMIC ), STATIC 并且无法更新游标。注意: 如果在 ABSOLUTE 尚未提取的键集中的行上指定,则操作可能会失败并发检查,并且无法保证返回结果。 |
rownum
指定游标对、更新或删除操作的提取缓冲区中的哪些行。 此参数不会影响任何 RELATIVE
、 NEXT
或 PREVIOUS
提取操作的起点,也不会影响使用的任何 sp_cursor
更新或删除。
rownum 是调用 int 输入值的必需参数。
1
指示提取缓冲区中的第一行。
2, 3, 4, ...n
表示第二行、第三行和第四行等。
0
指示提取缓冲区中的所有行。
此参数仅适用于与、DELETE
REFRESH
或 LOCK
optype 值一起使用UPDATE
。
table
当游标定义涉及联接或值参数返回不明确列名时,用于标识 optype 适用的表名的表名。 如果未指定任何特定表,则默认值为子句中的 FROM
第一个表。 表参数是可选的,需要字符串输入值。 字符串可以指定为任何字符或 Unicode 数据类型,也可以指定多部分表名称。
value
用于插入或更新值。 值字符串参数仅用于UPDATE
和 INSERT
optype 值。 可以将此字符串指定为任何字符或 Unicode 数据类型。
用户可以为值分配参数名称。
返回代码值
0
(成功)或 1
(失败)。
注解
optype 参数
除了与 UPDATE
、DELETE
、 REFRESH
或 LOCK
; ABSOLUTE
或任一或两UPDATE
DELETE
者的组合SETPOSITION
外,optype 值是互斥的。
值的SET
子句UPDATE
是从值参数构造的。
使用 INSERT <optype>
该值的一个好处是,可以避免将非字符数据转换为插入字符格式。 这些值与指定方式 UPDATE
相同。 如果不包含任何必需的列,则 INSERT
失败。
- 该值
SETPOSITION
不会影响任何PREVIOUS
RELATIVE
NEXT
或提取操作的起点,也不会影响使用sp_cursor
接口执行的任何更新或删除。 未在提取缓冲区中指定行的任何数字都会导致位置设置为1
该位置,不会返回错误。 执行后SETPOSITION
,该位置将一直有效,直到下一sp_cursorfetch
个操作、T-SQLFETCH
操作或sp_cursor
SETPOSITION
操作通过同一游标。 后续sp_cursorfetch
操作将游标的位置设置为新提取缓冲区中的第一行,而其他游标调用不会影响位置的值。SETPOSITION
可以由OR
子句链接,DELETE
REFRESH
UPDATE
也可以LOCK
将位置的值设置为上次修改的行。
如果未通过 rownum 参数指定提取缓冲区中的行,则位置设置为 1,且未返回错误。 设置位置后,它将一直有效,直到下一sp_cursorfetch
个操作、T-SQL FETCH
操作或sp_cursor
SETPOSITION
操作在同一游标上执行。
SETPOSITION
可以通过子句链接 OR
,DELETE
REFRESH
UPDATE
也可以LOCK
将光标位置设置为上次修改的行。
rownum 参数
如果指定, 行号 参数可以解释为键集中的行号,而不是提取缓冲区中的行号。 用户负责确保维护并发控制。 这意味着对于 SCROLL_LOCKS
游标,必须独立维护给定行的锁(可以通过事务完成)。 对于 OPTIMISTIC
游标,必须先提取该行才能执行此操作。
表参数
如果 optype 值是UPDATE
或INSERT
完整更新或插入语句作为值参数提交,则忽略为表指定的值。
注意
与视图有关,只能修改一个参与视图的表。 值参数列名称必须反映视图中的列名称,但表名可以是基础基表(在这种情况下,替换sp_cursor
视图名称)。
value 参数
使用参数部分前面所述的值的规则有两种替代方法:
对于任何命名值参数,可以使用选择列表中列名称前面添加的名称
@
。 此替代方法的一个优点是,数据转换可能没有必要。使用参数提交完整
UPDATE
或INSERT
语句,或使用多个参数提交部分UPDATE
或INSERT
语句,数据库引擎然后生成到完整语句中。 有关示例,请参阅 本文后面的“示例” 部分。
示例
备用值参数使用
对于 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
。 在这种情况下,不能使用其他命名参数。