sp_cursorprepexec (Transact-SQL)

适用于:SQL Server Azure SQL 数据库 Azure Synapse Analytics 分析平台系统 (PDW)

为提交的游标语句或批处理编译计划,然后创建并填充游标。 sp_cursorprepexec 合并 sp_cursorpreparesp_cursorexecute. 此过程通过在表格数据流 (TDS) 数据包中指定 ID = 5 来调用。

Transact-SQL 语法约定

语法

sp_cursorprepexec prepared handle OUTPUT , cursor OUTPUT , params , statement , options
    [ , scrollopt [ , ccopt [ , rowcount ] ] ]
    [ , '@parameter_name [ , ...n ]' ]

参数

准备句柄

SQL Server 生成的 已准备句柄 标识符。 准备句柄 是必需的,并返回 int

cursor

SQL Server 生成的 游标 标识符。 游标 是必须针对此游标执行的所有后续过程提供的必需参数,例如 sp_cursorfetch

params

标识参数化语句。 变量的参数定义将替换为语句中的参数标记。 params 是调用 ntextnchar 或 nvarchar 输入值的必需参数。

注意

参数化语句且 scrollopt PARAMETERIZED_STMT 值为 ON 时,请使用 ntext 字符串作为输入值。

语句

定义游标结果集。 语句参数是必需的,并调用 ntextnchar 或 nvarchar 输入值。

注意

指定语句值的规则与指定sp_cursoropen语句值的规则相同,但语句字符串数据类型必须为 ntext 除外

options

一个可选参数,它返回游标结果集列的说明。 选项 需要以下 int 输入值。

说明
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

由于请求的选项可能不适合由 语句定义的游标,因此此参数同时用作输入和输出。 在这种情况下,SQL Server 分配适当的类型并修改此值。

ccopt

并发控制选项。 ccopt 是一个可选参数,需要以下 int 输入值之一。

说明
0x0001 READ_ONLY
0x0002 SCROLL_LOCKS(以前称为 LOCKCC)
0x0004 乐观(以前称为 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 OPTIMISITC_ACCEPTABLE

scrollopt 一样,SQL Server 可以分配不同于所请求的值。

rowcount

一个可选参数,表示要用于AUTO_FETCH的提取缓冲区行数。 默认值为 20 行。 当分配为输入值与返回值时,rowcount 的行为方式不同。

作为输入值 作为返回值
使用FAST_FORWARD游标 行计数 指定AUTO_FETCH表示要放入提取缓冲区的行数。 表示结果集中的行数。 指定 scrollopt AUTO_FETCH 值时,行计数将返回提取缓冲区中的行数。

parameter_name

指定参数参数中定义的一个或多个参数名称。 必须为参数中包含的每个参数提供一个参数。 如果参数中的 Transact-SQL 语句或批处理未定义任何参数,则不需要此参数。

返回代码值

如果 参数 返回一个 NULL 值,则语句不会参数化。

示例

此示例演示了 sp_cursorprepexec如何使用 。 它针对数据库中的 PersonAdventureWorks2022 运行查询,返回名字为“Katherine”的所有记录。

USE AdventureWorks2022;
GO

DECLARE @prep_handle INT,
    @cursor INT,
    @scrollopt INT = 4104,
    @ccopt INT = 8193,
    @rowcnt INT;

EXEC sp_cursorprepexec
    @prep_handle OUTPUT,
    @cursor OUTPUT,
    N'@fName nvarchar(100)',
    N'SELECT FirstName, LastName FROM Person.Person WHERE FirstName = @fName',
    @scrollopt,
    @ccopt,
    @rowcnt OUTPUT,
    'Katherine';

EXEC sp_cursorfetch @cursor;