sys.dm_exec_cursors (Transact-SQL)

适用于SQL Server

返回有关在各种数据库中打开的游标的信息。

语法

  
dm_exec_cursors (session_id | 0 )  

参数

session_id | 0
会话的 ID。 如果 指定了session_id ,此函数将返回有关指定会话中的游标的信息。

如果指定了 0,则此函数返回有关所有会话的所有游标的信息。

返回的表

列名称 数据类型 说明
session_id int 持有此游标的会话 ID。
cursor_id int 游标对象的 ID。
name nvarchar(256) 用户定义的游标名称。
properties nvarchar(256) 指定游标的属性。 下列属性的值连在一起可构成此列的值:
声明接口
游标类型
游标并发
游标范围
游标嵌套级别

例如,此列中返回的值可能是“TSQL |动态 |乐观 |全局 (0)”。
sql_handle varbinary(64) 声明游标的批处理的文本句柄。
statement_start_offset int 在当前正在执行的批处理或存储过程中,指示当前正在执行的语句开始位置的字符数。 可与sql_handlestatement_end_offsetsys.dm_exec_sql_text动态管理函数一起使用,以检索请求的当前执行语句。
statement_end_offset int 在当前正在执行的批处理或存储过程中,指示当前正在执行的语句结束位置的字符数。 可与sql_handlestatement_start_offsetsys.dm_exec_sql_text动态管理函数一起使用,以检索请求的当前执行语句。
plan_generation_num bigint 可用于在重新编译后区分不同计划实例的序列号。
creation_time datetime 创建此游标时的时间戳。
is_open bit 指定游标是否处于打开状态。
is_async_population bit 指定后台线程是否仍异步填充 KEYSET 或 STATIC 游标。
is_close_on_commit bit 指定是否使用 CURSOR_CLOSE_ON_COMMIT 声明游标。

1 = 事务结束时将关闭游标。
fetch_status int 返回游标的上一提取状态。 这是最后返回@@FETCH_STATUS值。
fetch_buffer_size int 返回有关提取缓冲区大小的信息。

1 = Transact-SQL 游标。 对于 API 游标,可以将该参数设置为更高的值。
fetch_buffer_start int 对于 FAST_FORWARD 和 DYNAMIC 游标,如果游标未打开或被放在第一行之前,则该参数返回 0。 否则,返回 -1。

对于 STATIC 和 KEYSET 游标,如果游标未打开,则该参数返回 0;如果游标放在最后一行之外,则该参数返回 -1。

在其他情况下,该参数返回游标所在的行号。
ansi_position int 游标在提取缓冲区中的位置。
worker_time bigint 辅助线程执行此游标所用的时间(毫秒)。
bigint 游标所执行的读取次数。
bigint 游标所执行的写入次数。
dormant_duration bigint 自上次对此游标启动查询(打开或提取)以来所经过的时间(毫秒)。

权限

要求具有服务器的 VIEW SERVER STATE 权限。

SQL Server 2022 及更高版本的权限

要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

注解

下表提供了有关游标声明接口的信息,并列出了这些属性列的可能值。

properties 说明
API 使用一个数据访问 API(ODBC、OLEDB)声明游标。
TSQL 使用 Transact-SQL DECLARE CURSOR 语法声明游标。

下表提供了有关游标类型的信息,并列出了这些属性列的可能值。

类型 描述
Keyset 将游标声明为键集。
动态 将游标声明为动态。
快照 将游标声明为快照或静态。
Fast_Forward 将游标声明为快进。

下表提供了有关游标并发的信息,并列出了这些属性列的可能值。

并发 说明
只读 将游标声明为只读。
Scroll Locks 游标使用滚动锁。
乐观 游标使用乐观并发控制。

下表提供了有关游标范围的信息,并列出了这些属性列的可能值。

作用域 说明
Local 指定该游标的范围对在其中创建它的批处理、存储过程或触发器是局部的。
全局 指定该游标范围对连接是全局的。

示例

A. 检测旧游标

以下示例返回有关在服务器上打开时间超过指定时间(36 小时)的游标的信息。

SELECT creation_time, cursor_id, name, c.session_id, login_name   
FROM sys.dm_exec_cursors(0) AS c   
JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id   
WHERE DATEDIFF(hh, c.creation_time, GETDATE()) > 36;  
GO  

另请参阅

动态管理视图和函数 (Transact-SQL)
与执行有关的动态管理视图和函数 (Transact-SQL)
sys.dm_exec_sessions (Transact-SQL)