sp_cursor (Transact-SQL)

适用于:SQL Server

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

适用于:SQL Server(SQL Server 2008 [10.0.x] 至当前版本)。

Transact-SQL 语法约定

语法

  
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 参数

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

  1. 对于任何命名 参数,可以使用预写到选择列表中的列名称“@”的名称。 此替代方法的一个优点是可能不需要进行数据转换。

  2. 使用参数提交完整的 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)