SSRS 2012:提取指定表Status字段新旧值变更记录的方法
需求实现说明
实现识别rqia_registeredperson表中Status字段的变更并提取新旧值的需求不算特别复杂,但需要基于Dynamics CRM的审计表结构做扩展查询——你当前的查询仅用到了Audit表,而字段的具体新旧值存储在AuditDetail表中,AttributeMask只是用来标记哪些字段发生了变更,不包含实际值。
关键调整点
- 关联
AuditDetail表,获取字段变更的具体新旧值 - 过滤出目标Status字段(假设其逻辑名为
statuscode,如果是自定义字段请替换为实际逻辑名) - 处理选项集类型字段的新旧值(如果Status是选项集,需关联
StringMap表转换为可读文本)
修改后的查询语句
SELECT ev.LogicalName, CASE WHEN au.Operation = 1 THEN 'Create' WHEN au.Operation = 2 THEN 'Update' WHEN au.Operation = 3 THEN 'Delete' WHEN au.Operation = 4 THEN 'Access' END AS Action, FORMAT(DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), au.CreatedOn), 'dd/MM/yyyy HH:mm') AS AuditCreated, fr.rqia_registeredpersonidnumber AS RegisteredPerson, -- 获取Status字段的新旧值 ad.AttributeLogicalName AS ChangedField, -- 若Status是选项集,用StringMap转换为文本;否则直接取NewValue/OldValue ISNULL(sm_new.Value, ad.NewValue) AS NewStatusValue, ISNULL(sm_old.Value, ad.OldValue) AS OldStatusValue FROM [Audit] au INNER JOIN EntityView ev ON au.ObjectTypeCode = ev.ObjectTypeCode INNER JOIN Filteredrqia_registeredperson fr ON au.ObjectId = fr.rqia_registeredpersonid -- 关联AuditDetail获取字段变更详情 INNER JOIN AuditDetail ad ON au.AuditId = ad.AuditId -- 关联StringMap转换选项集值为可读文本(仅当Status是选项集时需要) LEFT JOIN StringMap sm_new ON ad.NewValue = sm_new.AttributeValue AND sm_new.AttributeName = 'statuscode' AND sm_new.ObjectTypeCode = au.ObjectTypeCode LEFT JOIN StringMap sm_old ON ad.OldValue = sm_old.AttributeValue AND sm_old.AttributeName = 'statuscode' AND sm_old.ObjectTypeCode = au.ObjectTypeCode WHERE ev.LogicalName = 'rqia_registeredperson' AND fr.rqia_registeredpersonidnumber = 'RP023523' -- 过滤仅Status字段的变更记录 AND ad.AttributeLogicalName = 'statuscode' ORDER BY ev.LogicalName, AuditCreated
补充说明
- 如果你的Status字段不是选项集(比如是文本/数值类型),可以去掉
StringMap的关联,直接使用ad.NewValue和ad.OldValue - 需确认Status字段的实际逻辑名,替换语句中的
statuscode为对应名称 - 原查询中的
GROUP BY可以去掉,因为我们现在是按每条字段变更记录返回,不需要分组
内容的提问来源于stack exchange,提问作者Paula Morrison
相关产品推荐
相关产品推荐

