You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将sys.dm_exec_sessions条目关联至查询执行的数据库?

如何通过sys.dm_exec_sessions确定查询对应的执行数据库

要确定正在运行的查询所属的数据库,可通过关联系统动态管理视图实现,具体方法如下:

核心逻辑

sys.dm_exec_sessions 自带会话的默认数据库ID,但如果查询是在其他数据库上下文执行(比如显式切换库、跨库查询),就得结合 sys.dm_exec_requests 获取当前执行请求的实际数据库,再关联 sys.databases 把ID转换成可读的数据库名称。

实用查询示例

SELECT
    s.session_id,
    s.login_name,
    DB_NAME(COALESCE(r.database_id, s.database_id)) AS 执行数据库,
    r.status,
    r.command,
    s.program_name,
    r.start_time,
    SUBSTRING(qt.text, r.statement_start_offset/2 + 1, 
              (CASE WHEN r.statement_end_offset = -1 THEN DATALENGTH(qt.text) 
               ELSE r.statement_end_offset END - r.statement_start_offset)/2 + 1) AS 当前执行语句
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) qt
WHERE s.is_user_process = 1 -- 仅显示用户进程,过滤系统进程
ORDER BY r.start_time DESC;

关键字段解释

  • session_id: 会话的唯一标识
  • COALESCE(r.database_id, s.database_id): 优先取请求的实际执行数据库ID,若会话无运行请求则取默认数据库ID,再用DB_NAME()转换为名称
  • status: 当前请求的状态(比如running、suspended)
  • command: 执行的命令类型(比如SELECT、INSERT)
  • 当前执行语句: 截取的正在运行的SQL片段

补充提示

  • 若只需会话的默认数据库,直接查询sys.dm_exec_sessions的database_id字段,用DB_NAME(database_id)转换即可
  • 跨库查询时,r.database_id会显示当前操作的目标数据库ID,比如执行SELECT * FROM OtherDB.dbo.Table时,该字段对应OtherDB的ID

内容的提问来源于stack exchange,提问作者benjamin moskovits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:32:09