如何通过SQL查询获取SQL Server作业名、关联数据库名与服务器名
问题原因
sysjobsteps系统表的database_name字段仅会存储T-SQL类型作业步骤的关联数据库,针对执行XMLA代码的SSAS命令类作业步骤,目标数据库信息直接内嵌在command字段的XML代码中,不会写入database_name字段,这是原查询返回结果不准确的核心原因。
适配查询方案
下面的查询会自动区分作业步骤类型,T-SQL步骤直接取原生database_name值,SSAS类型步骤通过XML解析提取XMLA代码中指定的目标数据库:
SELECT job.job_id, job.name AS job_name, job.description, steps.step_id, steps.step_name, steps.subsystem AS step_type, steps.command, steps.server, -- 区分步骤类型获取正确的依赖数据库名 CASE WHEN steps.subsystem = 'TSQL' THEN steps.database_name WHEN steps.subsystem = 'ANALYSISCOMMAND' THEN TRY_CAST(steps.command AS XML).value('(//*:DatabaseID/text())[1]', 'sysname') ELSE '非T-SQL/SSAS步骤,无关联数据库' END AS depend_database_name FROM msdb.dbo.sysjobs job INNER JOIN msdb.dbo.sysjobsteps steps ON job.job_id = steps.job_id WHERE job.enabled = 1;
注意事项
- 查询中使用了
TRY_CAST避免非法XML格式的command内容导致整个查询报错,若解析失败对应depend_database_name会返回NULL,可单独排查这类异常步骤 - 如果单条XMLA代码中包含多个SSAS数据库的操作,上述查询默认返回第一个匹配的
DatabaseID值,多库操作场景可根据需求调整XML解析的节点匹配逻辑 - 执行查询的账号需要拥有
msdb数据库的查询权限
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

