sp_cursor (Transact-SQL)
适用于:SQL Server
请求定位更新。 此过程对游标的提取缓冲区内的一行或多行执行操作。 通过在表格数据流 (TDS) 数据包中指定 ID = 1 来调用sp_cursor。
适用于:SQL Server(SQL Server 2008 [10.0.x] 至当前版本)。 |
语法
sp_cursor cursor, optype, rownum, table
[ , value[...n]]]
参数
cursor
游标句柄。 cursor 是调用 int 输入值的必需参数。 游标 是由 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-Lock。 此锁与 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 操作类型 值。
table
当游标定义涉及联接或不明确列名时,用于标识 optype 适用的表名的表名由值参数返回。 如果未指定特定的表,则默认为 FROM 子句中的第一个表。 表 是需要字符串输入值的可选参数。 可以将此字符串指定为任何字符或 UNICODE 数据类型。 表 可以是多部分表名称。
value
用于插入或更新值。 值字符串参数仅用于 UPDATE 和 INSERT 操作类型值。 可以将此字符串指定为任何字符或 UNICODE 数据类型。
注意
用户可以为值分配参数名称。
返回代码值
使用 RPC 时,具有缓冲区号 0 的定位 DELETE 或 UPDATE 操作将针对提取缓冲区中的每个行返回行计数为 0(失败)或 1(成功)的 DONE 消息。
注解
optype 参数
除 SETPOSITION 与 UPDATE、DELETE、REFRESH 或 LOCK 的组合外;或者具有 UPDATE 或 DELETE 的 ABSOLUTE,则 optype 值是互斥的。
UPDATE 值的 SET 子句是从值参数构造的。
使用 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 参数
如果指定, 行号 参数可以解释为键集中的行号,而不是提取缓冲区中的行号。 用户负责确保维护并发控制。 这意味着,对于 SCROLL_LOCKS 游标,您必须独立维护给定行的锁(此操作可通过一个事务完成)。 对于 OPTIMISTIC 游标,您必须事先提取行以执行此操作。
table 参数
如果 optype 值为 UPDATE 或 INSERT,并且完整更新或 insert 语句作为值参数提交,则忽略为表指定的值。
注意
与视图相关,仅可修改一个参与视图的表。 值参数列名称必须反映视图中的列名称,但表名称可以是基础基表(在这种情况下,sp_cursor将替换视图名称)。
value 参数
使用参数部分前面所述的值的规则有两种替代方法:
对于任何命名 值 参数,可以使用“@”预写到选择列表中的列的名称。 此替代方法的一个优点是可能不需要进行数据转换。
使用参数提交完整的 UPDATE 或 INSERT 语句,或使用多个参数提交 UPDATE 或 INSERT 语句的部分,然后 SQL Server 将生成到完整语句中。 此类示例可在本主题后面的“示例”部分中找到。
示例
备选 value 参数用法
对于 UPDATE:
当使用单个参数时,可以使用以下语法提交 UPDATE 语句:
[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,...n]
注意
如果指定 UPDATE <表名称> ,将忽略为 表 参数指定的任何值。
当使用多个参数时,第一个参数必须为采用以下形式的字符串:
[ SET ] <column name> = expression [,...n]
并且后续参数必须为以下形式:
<column name> = expression [,...n]
在这种情况下,<构造的 update 语句中的表名>是表参数指定的或默认名称。
对于 INSERT:
当使用单个参数时,可以使用以下语法提交 INSERT 语句:
[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )
注意
如果指定了 INSERT <表名称>,将忽略为表参数指定的任何值。
当使用多个参数时,第一个参数必须为采用以下形式的字符串:
[ VALUES ( ] <expression> [,...n]
并且后续参数必须为以下形式:
expression [,...n]
除了指定 VALUES 之外,在此情况下,在最后一个表达式后面必须带一个尾随“)”。 在这种情况下,构造的 UPDATE 语句中的表名>是表参数指定的或默认名称。<
注意
可以提交一个参数作为命名参数,也即“@VALUES
”。 在此情况下,不能使用其他命名参数。
另请参阅
sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
系统存储过程 (Transact-SQL)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈