如何在AX2012 R3中定位批处理作业关联的SQL查询
排查AX2012 R3批处理作业关联查询与数据表(无AOS/AOT权限)
一、获取目标批处理的核心ID
先从BATCHJOB表定位目标作业的RecId:
SELECT RecId, JobDescription, CreatedDateTime, Status FROM BATCHJOB WHERE JobDescription LIKE '%你的批处理作业名称%' -- 替换为实际作业名称
二、通过数据库表关联查询作业涉及的对象
AX的批处理作业由多个具体任务组成,可通过以下表链追踪关联的类或查询:
1. 关联批处理任务与AOT对象
利用BATCHTASK和SYSOBJECTTABLE关联,获取任务对应的类或查询名称:
SELECT bt.RecId AS BatchTaskRecId, bt.ClassNum, bt.QueryId, so.Name AS ObjectName, so.Type AS ObjectType -- 0=类,2=查询 FROM BATCHTASK bt JOIN SYSOBJECTTABLE so ON (bt.ClassNum = so.Id AND so.Type = 0) OR (bt.QueryId = so.Id AND so.Type = 2) WHERE bt.BatchJobId = '替换为目标BatchJob的RecId'
2. 提取查询对象的表依赖(若为查询驱动批处理)
如果ObjectType为2(查询),从SYSOBJECTDATA获取查询的XML定义,解析其中的表ID:
SELECT sod.Data FROM SYSOBJECTDATA sod JOIN SYSOBJECTTABLE so ON sod.Id = so.Id AND so.Type = 2 WHERE so.Id = '替换为查询的QueryId'
XML中的<TableId>节点对应表ID,可通过SQLSYSTEMTABLES转换为表名:
SELECT Name FROM SQLSYSTEMTABLES WHERE TableId = 'XML中提取的TableId值'
三、SQL Profiler聚焦目标批处理
通过以下过滤条件减少冗余信息,仅捕获目标作业的SQL:
- 按
ApplicationName过滤:选择对应AOS实例的名称(通常格式为Microsoft Dynamics AX [AOS实例名]) - 按
NTUserName过滤:批处理作业一般以指定服务账户运行,筛选该账户 - 关键文本过滤:添加
TextData过滤器,包含目标批处理的RecId(AX执行批处理时会在会话信息中携带BatchJobId: [RecId]标识)
另外,可查询执行历史表了解作业耗时:
SELECT bh.StartDateTime, bh.EndDateTime, DATEDIFF(SECOND, bh.StartDateTime, bh.EndDateTime) AS DurationSec, bth.TaskDescription FROM BATCHHISTORY bh JOIN BATCHTASKHISTORY bth ON bh.BatchJobId = bth.BatchJobId WHERE bh.BatchJobId = '替换为目标BatchJob的RecId'
内容的提问来源于stack exchange,提问作者pnauta
相关产品推荐
相关产品推荐

