sp_cursor (Transact-SQL)
请求定位更新。 此过程对游标的提取缓冲区内的一行或多行执行操作。 可通过在表格格式数据流 (TDS) 包中指定 ID = 1 来调用 sp_cursor。
适用范围:SQL Server(SQL Server 2008 到当前版本)。 |
语法
sp_cursor cursor, optype, rownum, table
[ , value [...n] ] ]
参数
cursor
游标句柄。 cursor 是一个必需参数,它需要 int 输入值。 cursor 是由 SQL Server 生成并由 sp_cursoropen 过程返回的句柄值。optype
一个必需参数,它指定游标将执行的操作。 optype 需要以下 int 输入值之一。值
名称
说明
0X0001
UPDATE
用于更新提取缓冲区中的一行或多行。 重新访问和更新在 rownum 中指定的行。
0x0002
DELETE
用于删除提取缓冲区中的一行或多个行。 重新访问并删除在 rownum 中指定的行。
0X0004
INSERT
插入数据,而不生成 SQL INSERT 语句。
0X0008
REFRESH
用于从基础表中重新填充缓冲区,并且可用于刷新行(如果由于乐观并发控制导致更新或删除失败或在某个 UPDATE 之后)。
0X10
LOCK
导致要在包含指定行的页上获取 SQL Server U 锁。 此锁与 S 锁兼容,但不与 X 锁或其他 U 锁兼容。 可用于实现短期锁定。
0X20
SETPOSITION
仅当程序将要发布后续 SQL Server 定位 DELETE 或 UPDATE 语句时才使用。
0X40
ABSOLUTE
仅能与 UPDATE 或 DELETE 结合使用。 ABSOLUTE 仅与 KEYSET 游标结合使用(对于 DYNAMIC 游标将忽略,并且无法更新 STATIC 游标)。
备注
如果在尚未提取的键集中的某行上指定 ABSOLUTE,则此操作可能会导致并发检查失败且无法保证返回结果。
rownum
指定提取缓冲区中游标将对其执行操作、更新或删除的行。备注
这不会影响任何 RELATIVE、NEXT 或 PREVIOUS 提取操作的起点,也不影响任何使用 sp_cursor 执行的更新或删除。
rownum 是一个必需参数,它需要 int 输入值。
1
指示提取缓冲区中的第一行。2
指示提取缓冲区中的第二行。3, 4, 5
指示第三行,依此类推。n
指示提取缓冲区中的第 n 行。0
指示提取缓冲区中的所有行。备注
仅当与 UPDATE、DELETE、REFRESH 或 LOCK optype 值结合使用时才有效。
table
当游标定义涉及联接或 value 参数返回模糊的列名时,标识 optype 应用到的表的表名称。 如果未指定特定的表,则默认为 FROM 子句中的第一个表。 table 是一个可选参数,它需要 String 输入值。 可以将此字符串指定为任何字符或 UNICODE 数据类型。 table 可以是由多个部分构成的表名称。value
用于插入或更新值。 value 字符串参数仅用于 UPDATE 和 INSERT optype 值。 可以将此字符串指定为任何字符或 UNICODE 数据类型。备注
value 的参数名称可由用户分配。
返回代码值
当使用 RPC 时,定位的 DELETE 或 UPDATE 操作(缓冲区编号为 0)将返回一条 DONE 消息,并针对提取缓冲区中的每一行显示 rowcount 0(失败)或 1(成功)。
注释
optype 参数
除了 SETPOSITION 与 UPDATE、DELETE、REFRESH 或 LOCK 的组合或 ABSOLUTE 与 UPDATE 或 DELETE 的组合之外,optype 值是互斥的。
UPDATE 值的 SET 子句是从 value 参数构造的。
使用 INSERT optype 值的优势之一是您可以避免将非字符数据转换为字符格式以执行插入。 指定值的方式与 UPDATE 相同。 如果不包含任何所需的列,则 INSERT 失败。
- SETPOSITION 值不影响任何 RELATIVE、NEXT 或 PREVIOUS 提取操作的起点,也不会使用 sp_cursor 接口执行任何更新或删除。 任何未在提取缓冲区中指定行的编号都将导致位置设置为 1,且不返回错误。 一旦执行了 SETPOSITION,则在通过同一个游标执行下一个 sp_cursorfetch 操作、T-SQL FETCH 操作或 sp_cursor SETPOSITION 操作之前,此位置一直保持有效。 在其他游标调用将不会影响此位置的值时,后续 sp_cursorfetch 操作将游标的位置设置为新提取缓冲区中的第一行。 SETPOSITION 可由 OR 子句链接到 REFRESH、UPDATE、DELETE 或 LOCK,以便将位置的值设置为上次修改的行。
如果提取缓冲区中的行未通过 rownum 参数指定,则此位置将设置为 1,且不会返回错误。 一旦设置了此位置,它将保持有效,直至对同一游标执行下一个 sp_cursorfetch 操作、T-SQL FETCH 操作或 sp_cursor SETPOSITION 操作。
SETPOSITION 可由 OR 子句与 REFRESH、UPDATE、DELETE 或 LOCK 进行链接,以便将游标位置设置为上一次修改的行。
rownum 参数
如果指定此参数,则 rownum 参数可以解释为键集中的行号,而不是提取缓冲区中的行号。 用户负责确保维护并发控制。 这意味着,对于 SCROLL_LOCKS 游标,您必须独立维护给定行的锁(此操作可通过一个事务完成)。 对于 OPTIMISTIC 游标,您必须事先提取行以执行此操作。
table 参数
如果 optype 值为 UPDATE 或 INSERT,且完全更新或插入语句作为 value 参数提交,则忽略为 table 指定的值。
备注
与视图相关,仅可修改一个参与视图的表。value 参数列名称必须在视图中反映列名称,但表名称可为基础基表的名称(在任一情况下,sp_cursor 都将替换视图名称)。
value 参数
针对使用 value 的规则提供了两个替代方法,如“参数”部分中前面的内容所述:
在任何命名的 value 参数的选择列表中,可以使用一个在列名称之前附加“@”的名称。 此替代方法的一个优点是可能不需要进行数据转换。
使用一个参数提交一个完整的 UPDATE 语句 或 INSERT 语句,或使用多个参数提交 UPDATE 语句或 INSERT 语句的一部分(然后,SQL Server 将其生成为一个完整语句)。此类示例可在本主题后面的“示例”部分中找到。
示例
备选 value 参数用法
对于 UPDATE:
当使用单个参数时,可以使用以下语法提交 UPDATE 语句:
[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,…n]
备注
如果指定了 UPDATE <表名称>,将忽略任何为 table 参数指定的值。
当使用多个参数时,第一个参数必须为采用以下形式的字符串:
[ SET ] <column name> = expression [,... n]
并且后续参数必须为以下形式:
<column name> = expression [,... n]
在此情况下,所构造的更新语句中的 <表名称> 为由 table 参数指定的名称或默认的名称。
对于 INSERT:
当使用单个参数时,可以使用以下语法提交 INSERT 语句:
[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,... n] )
备注
如果指定了 INSERT <table name>,将忽略任何为 table 参数指定的值。
当使用多个参数时,第一个参数必须为采用以下形式的字符串:
[ VALUES ( ] <expression> [,... n]
并且后续参数必须为以下形式:
expression [,... n]
除了指定 VALUES 之外,在此情况下,在最后一个表达式后面必须带一个尾随“)”。 在此情况下,所构造的 UDPATE 语句中的 <table name> 是由 table 参数指定的名称或默认名称。
备注
可以提交一个参数作为命名参数,也即“@VALUES”。在此情况下,不能使用其他命名参数。
请参阅
参考