适用范围:SQL Server
将游标语句或批处理编译为执行计划,但不创建游标。 稍后可以使用 sp_cursorexecute编译的语句。 此过程与 sp_cursorexecute此过程具有相同的功能 sp_cursoropen,但分为两个阶段。
sp_cursorprepare 通过在表格数据流(TDS)数据包中指定 ID = 3 来调用。
语法
sp_cursorprepare prepared_handle OUTPUT , params , stmt , options
[ , scrollopt [ , ccopt ] ]
[ ; ]
参数
重要
扩展存储过程的参数必须按特定顺序输入,如 语法 节中所述。 如果参数按顺序输入,则会出现错误消息。
prepared_handle
一个 SQL Server 生成的准备 handle 标识符,该标识符返回 int 值。
然后,prepared_handle 提供给过程 sp_cursorexecute 以打开游标。 创建句柄后,该句柄就会存在,直到注销,或者通过过程显式删除它 sp_cursorunprepare 。
params
标识参数化语句。
变量的参数定义将替换为语句中的参数标记。
params 是调用 ntext、nchar 或 nvarchar 输入值的必需参数。
NULL如果未参数化语句,则输入值。
参数化 stmt 且 scrollopt PARAMETERIZED_STMT 值为 ON 时,请使用 ntext 字符串作为输入值。
stmt
定义游标结果集。 stmt 参数是必需的,并调用 ntext、**nchar 或 nvarchar 输入值。
指定 stmt 值的规则与指定 stmt 值的规则相同sp_cursoropen,但 stmt 字符串数据类型必须为 ntext 除外。
options
返回游标结果集列的说明。 options 参数为 int,默认值为 NULL. 设置为时 0x0001,表示 RETURN_METADATA。
scrollopt
滚动选项。 scrollopt 参数是一个可选参数,需要以下 int 输入值之一。
| 值 | 说明 |
|---|---|
0x0001 |
KEYSET |
0x0002 |
DYNAMIC |
0x0004 |
FORWARD_ONLY |
0x0008 |
STATIC |
0x10 |
FAST_FORWARD |
0x1000 |
PARAMETERIZED_STMT |
0x2000 |
AUTO_FETCH |
0x4000 |
AUTO_CLOSE |
0x8000 |
CHECK_ACCEPTED_TYPES |
0x10000 |
KEYSET_ACCEPTABLE |
0x20000 |
DYNAMIC_ACCEPTABLE |
0x40000 |
FORWARD_ONLY_ACCEPTABLE |
0x80000 |
STATIC_ACCEPTABLE |
0x100000 |
FAST_FORWARD_ACCEPTABLE |
由于请求的值可能不适合 stmt 定义的游标,因此此参数既充当输入和输出。 在此类情况下,SQL Server 分配一个适当的值。
ccopt
并发控制选项。 ccopt 是一个可选参数,需要以下 int 输入值之一。
| 值 | 说明 |
|---|---|
0x0001 |
READ_ONLY |
0x0002 |
SCROLL_LOCKS (以前称为 LOCKCC) |
0x0004 |
OPTIMISTIC (以前称为 OPTCC) |
0x0008 |
OPTIMISTIC (以前称为 OPTCCVAL) |
0x2000 |
ALLOW_DIRECT |
0x4000 |
UPDT_IN_PLACE |
0x8000 |
CHECK_ACCEPTED_OPTS |
0x10000 |
READ_ONLY_ACCEPTABLE |
0x20000 |
SCROLL_LOCKS_ACCEPTABLE |
0x40000 |
OPTIMISTIC_ACCEPTABLE |
0x80000 |
OPTIMISTIC_ACCEPTABLE |
与 scrollpt 一样,SQL Server 可以分配与所请求的值不同的值。
注解
RPC 状态参数是以下值之一:
| 值 | 说明 |
|---|---|
0 |
成功 |
0x0001 |
失败 |
1FF6 |
无法返回元数据。 注意: 这是因为该语句不生成结果集;例如,它是一个 INSERT 或 DDL 语句。 |
示例
以下代码是一个使用 sp_cursorprepare 和 sp_cursorexecute示例:
DECLARE @handle AS INT, @p5 AS INT, @p6 AS INT;
EXECUTE sp_cursorprepare
@handle OUTPUT,
N'@dbid int',
N'select * from sys.databases where database_id < @dbid',
1,
@p5 OUTPUT,
@p6 OUTPUT;
DECLARE @p1 AS INT;
SET @P1 = @handle;
DECLARE @p2 AS INT;
DECLARE @p3 AS INT;
DECLARE @p4 AS INT;
SET @P6 = 4;
EXECUTE sp_cursorexecute
@p1,
@p2 OUTPUT,
@p3 OUTPUT,
@p4 OUTPUT,
@p5 OUTPUT,
@p6;
EXECUTE sp_cursorfetch @P2;
EXECUTE sp_cursorunprepare @handle;
EXECUTE sp_cursorclose @p2;
参数化 stmtON格式:
<parameter_name> <data_type> [ ,... n ]