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 输入值的必需参数。 游标 是由 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 参数

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

  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 <表名称>,将忽略为参数指定的任何值。

当使用多个参数时,第一个参数必须为采用以下形式的字符串:

[ VALUES ( ] <expression> [,...n]

并且后续参数必须为以下形式:

expression [,...n]

除了指定 VALUES 之外,在此情况下,在最后一个表达式后面必须带一个尾随“)”。 在这种情况下,构造的 UPDATE 语句中的表名>是表参数指定的或默认名称。<

注意

可以提交一个参数作为命名参数,也即“@VALUES”。 在此情况下,不能使用其他命名参数。

另请参阅

sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
系统存储过程 (Transact-SQL)