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 输入值的必需参数。 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-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 optype 值一起使用有效。
table
当游标定义涉及联接或不明确的列名时,标识 optype 应用于的表的表名由 value 参数返回。 如果未指定特定的表,则默认为 FROM 子句中的第一个表。 table 是一个可选参数,需要字符串输入值。 可以将此字符串指定为任何字符或 UNICODE 数据类型。 table 可以是多部分表名。
value
用于插入或更新值。 值字符串参数仅用于 UPDATE 和 INSERT optype 值。 可以将此字符串指定为任何字符或 UNICODE 数据类型。
注意
值的参数 名称可由用户 分配。
返回代码值
使用 RPC 时,缓冲区编号为 0 的定位 DELETE 或 UPDATE 操作将返回一条 DONE 消息,该消息的 行计数 为 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,并且完整的 update 或 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 <表名称> ,则将忽略为 table 参数指定的任何值。
当使用多个参数时,第一个参数必须为采用以下形式的字符串:
[ VALUES ( ] <expression> [,...n]
并且后续参数必须为以下形式:
expression [,...n]
除了指定 VALUES 之外,在此情况下,在最后一个表达式后面必须带一个尾随“)”。 在这种情况下,<构造的 UPDATE 语句中的表名称>是表参数指定或默认为的名称。
注意
可以提交一个参数作为命名参数,也即“@VALUES
”。 在此情况下,不能使用其他命名参数。
另请参阅
sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
系统存储过程 (Transact-SQL)
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈