sys.dm_broker_queue_monitors (Transact-SQL)

适用范围:SQL Server

对于实例中的每个队列监视器,相应地返回一行。 队列监视器负责管理队列的激活。

列名称 数据类型 描述
database_id int 数据库的对象标识符,该数据库包含了监视器所观察的队列。 Nullable。
queue_id int 监视器所观察的队列的对象标识符。 Nullable。
state nvarchar(32) 监视器的状态。 Nullable。 此值是以下选项之一:

INACTIVE
NOTIFIED
RECEIVES_OCCURRING
last_empty_rowset_time datetime RECEIVE上次从队列返回空结果的时间。 Nullable。
last_activated_time datetime 此队列监视器上次激活存储过程时的时间。 Nullable。
tasks_waiting int 当前正在等待此队列的语句中的 RECEIVE 会话数。 Nullable。

注意: 此数字包括执行 receive 语句的任何会话,无论队列监视器是否启动会话。 这适用于WAITFORRECEIVE与 .. 换句话说,这些任务正在等待消息到达队列。

权限

SQL Server 2019 (15.x) 和早期版本需要 VIEW SERVER STATE 对服务器具有权限。

SQL Server 2022 (16.x) 及更高版本需要 VIEW SERVER PERFORMANCE STATE 对服务器具有权限。

示例

A. 当前状态队列监视器

此方案提供了所有消息队列的当前状态。

SELECT DB_NAME() AS [Database_Name],
       s.[name] AS [Service_Name],
       sch.[name] AS [Schema_Name],
       q.[name] AS [Queue_Name],
       ISNULL(m.[state], N'Not available') AS [Queue_State],
       m.tasks_waiting,
       m.last_activated_time,
       m.last_empty_rowset_time,
       (SELECT COUNT(1)
        FROM sys.transmission_queue AS t6
        WHERE t6.from_service_name = s.[name]) AS Tran_Message_Count
FROM sys.services AS s
     INNER JOIN sys.databases AS d
         ON d.database_id = DB_ID()
     INNER JOIN sys.service_queues AS q
         ON s.service_queue_id = q.[object_id]
     INNER JOIN sys.schemas AS sch
         ON q.[schema_id] = sch.[schema_id]
     LEFT OUTER JOIN sys.dm_broker_queue_monitors AS m
         ON q.[object_id] = m.queue_id
        AND m.database_id = d.database_id;