sys.dm_exec_cursors

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

语法

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 | Dynamic | Optimistic | Global (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

辅助线程执行此游标所用的时间(毫秒)。

reads

bigint

游标所执行的读取次数。

Writes

bigint

游标所执行的写入次数。

dormant_duration

bigint

自上次对此游标启动查询(打开或提取)以来所经过的时间(毫秒)。

权限

需要对服务器拥有 VIEW SERVER STATE 权限。

注释

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

属性

说明

API

使用一个数据访问 API(ODBC、OLEDB)声明游标。

TSQL

使用 Transact-SQL DECLARE CURSOR 语法声明游标。

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

类型

说明

Keyset

将游标声明为键集。

Dynamic

将游标声明为动态。

Snapshot

将游标声明为快照或静态。

Fast_Forward

将游标声明为快进。

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

并发

说明

Read Only

将游标声明为只读。

Scroll Locks

游标使用滚动锁。

Optimistic

游标使用乐观并发控制。

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

范围

说明

Local

指定该游标的范围对在其中创建它的批处理、存储过程或触发器是局部的。

Global

指定该游标范围对连接是全局的。

示例

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