sp_describe_cursor (Transact-SQL)

适用于SQL Server

报告服务器游标的属性。

Transact-SQL 语法约定

语法

sp_describe_cursor
    [ @cursor_return = ] cursor_return OUTPUT
    , [ @cursor_source = ] { N'local' | N'global' | N'*cursor_source*' }
    , [ @cursor_identity = ] N'cursor_identity'
[ ; ]

参数

[ @cursor_return = ] cursor_return OUTPUT

要接收游标输出的声明游标变量的名称。 @cursor_return是 int 类型的 OUTPUT 参数,没有默认值,且在调用时sp_describe_cursor不得与任何游标相关联。 返回的游标是可滚动的动态只读游标。

[ @cursor_source = ] { N'local' |N'global' |N'cursor_source' }

指定是否使用本地游标、全局游标或游标变量的名称指定所报告的游标。 @cursor_source为 nvarchar(30),没有默认值。

[ @cursor_identity = ] N'cursor_identity'

由语句创建的 DECLARE CURSOR 游标的名称。 @cursor_identity为 nvarchar(128),没有默认值。

  • 如果游标具有LOCAL关键字或默认为 LOCAL,则@cursor_identitylocal

  • 如果游标具有GLOBAL关键字或默认为 GLOBAL,则@cursor_identityglobal @cursor_identity也可以是 ODBC 应用程序打开的 API 服务器游标的名称,然后通过调用命名SQLSetCursorName

  • 否则, @cursor_identity 是与打开的游标关联的游标变量的名称。

返回代码值

无。

返回的游标

sp_describe_cursor 在 Transact-SQL cursor 输出参数中封装其结果集。 这样,Transact-SQL 批处理、存储过程和触发器就可以一次处理一行输出。 这也意味着无法直接从数据库 API 函数调用该过程。 cursor输出参数必须绑定到程序变量,但数据库 API 不支持绑定cursor参数或变量。

下表显示了使用 sp_describe_cursor.. 返回的游标的格式。 游标的格式与使用 sp_cursor_list时返回的格式相同。

列名称 数据类型 描述
reference_name sysname 用于引用游标的名称。 如果对游标的引用是通过语句上 DECLARE CURSOR 指定的名称,则引用名称与游标名称相同。 如果通过变量引用游标,则引用名称为变量的名称。
cursor_name sysname 语句中的游标 DECLARE CURSOR 的名称。 如果游标是通过将游标变量设置为游标创建的, cursor_name 则返回游标变量的名称。 在早期版本的 SQL Server 中,此输出列返回系统生成的名称。
cursor_scope tinyint 1 = LOCAL
2 = GLOBAL
status int 与系统函数报告的 CURSOR_STATUS 相同值:

1 = 游标名称或变量引用的游标处于打开状态。 如果游标不区分、静态或键集,则至少为一行。 如果游标是动态的,则结果集具有零行或多行。
0 = 游标名称或变量引用的游标处于打开状态,但没有行。 动态游标从不返回此值。
-1 = 游标名称或变量引用的游标已关闭。
-2 = 仅适用于游标变量。 没有分配给变量的游标。 可能,参数 OUTPUT 将游标分配给变量,但存储过程在返回之前关闭了游标。
-3 = 具有指定名称的游标或游标变量不存在,或者游标变量没有分配给它的游标。
model tinyint 1 = 不区分(或静态)
2 = 键集
3 = 动态
4= 快速转发
concurrency tinyint 1 = 只读
2 = 滚动锁
3 = 乐观
scrollable tinyint 0 = 仅向前
1 = 可滚动
open_status tinyint 0 = 已关闭
1 = 打开
cursor_rows 十进制(10,0) 结果集中符合条件的行数。 有关详细信息,请参阅 @@CURSOR_ROWS
fetch_status smallint 此游标上最后一次提取的状态。 有关详细信息,请参阅 @@FETCH_STATUS

0 = 提取成功。
-1 = 提取失败或超出游标的边界。
-2 = 缺少请求的行。
-9 = 游标上未发生提取。
column_count smallint 游标结果集中的列数。
row_count 十进制(10,0) 受游标的上次操作影响的行数。 有关详细信息,请参阅 @@ROWCOUNT
last_operation tinyint 对游标执行的最后一个操作:

0 = 未对游标执行任何操作。
1 = OPEN
2 = FETCH
3 = INSERT
4 = UPDATE
5 = DELETE
6 = CLOSE
7 = DEALLOCATE
cursor_handle int 服务器范围内的游标唯一值。

注解

sp_describe_cursor 描述全局到服务器游标的属性,例如滚动和更新的功能。 用于 sp_describe_cursor_columns 说明游标返回的结果集的属性。 用于 sp_describe_cursor_tables 游标引用的基表的报表。 若要获取在连接上可见的 Transact-SQL Server 游标的报表,请使用 sp_cursor_list

语句 DECLARE CURSOR 可能会请求 SQL Server 无法使用 SELECT 包含在其中的 DECLARE CURSOR语句的游标类型。 SQL Server 隐式将游标转换为可以使用该语句支持 SELECT 的类型。 如果在 TYPE_WARNING 语句中 DECLARE CURSOR 指定,SQL Server 会向应用程序发送一条信息性消息,指出转换已完成。 sp_describe_cursor 然后,可以调用以确定已实现的游标的类型。

权限

要求 公共 角色具有成员身份。

示例

下面的示例将打开一个全局游标,并使用 sp_describe_cursor 报告该游标的属性。

USE AdventureWorks2022;
GO
-- Declare and open a global cursor.
DECLARE abc CURSOR STATIC FOR
SELECT LastName
FROM Person.Person;

OPEN abc;

-- Declare a cursor variable to hold the cursor output variable
-- from sp_describe_cursor.
DECLARE @Report CURSOR;

-- Execute sp_describe_cursor into the cursor variable.
EXEC master.dbo.sp_describe_cursor
    @cursor_return = @Report OUTPUT,
    @cursor_source = N'global',
    @cursor_identity = N'abc';

-- Fetch all the rows from the sp_describe_cursor output cursor.
FETCH NEXT from @Report;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
    FETCH NEXT from @Report;
END

-- Close and deallocate the cursor from sp_describe_cursor.
CLOSE @Report;
DEALLOCATE @Report;
GO

-- Close and deallocate the original cursor.
CLOSE abc;
DEALLOCATE abc;
GO