背景
dynamics 365 是在系統上創建實體(表/視圖), 並不是直接在數據庫操作, 以至於, 我們在查看/直連數據庫的時候要查看某個字段是做什麼的非常不方便.
思路
博主不止一次被公司其他部門索要數據字典, 但是dynamics 365並沒有一個好用的可以導出數據字典的方式, 但是發現視圖基本都是存儲在 MetadataSchema.XXX 表裏
- MetadataSchema.Entity 存儲表/視圖
- MetadataSchema.Attribute 存儲字段
- MetadataSchema.AttributeTypes 存儲數據類型
- MetadataSchema.LocalizedLabel 存儲字段備註
- StringMap 存儲多選/單選的值和對應說明
需要注意的是以上表都是一對多,由於版本, 是否發佈等多種原因,可能查出來有重複的數據, 需要注意篩選, 如果可以, 也非常希望各位持續優化, 由於並沒有找到官方對應的文檔, 基本都是自己摸索, 持續優化中
於是思路是通過SQL語句查詢生成數據字典
博主使用的Microsoft Dynamics 365版本是 1612 (9.0.24.8) (DB 9.0.24.8) (本地), 不同的版本可能數據結構不一定相同, 可能需要看情況優化
SQL語句
SELECT ent.BaseTableName AS '表名', ent.Name AS '視圖名', ent.OriginalLocalizedName AS '表說明', attr.Name AS '字段名', tps.Description AS '字段類型', attr.Length AS '字段長度', CASE attr.IsNullable WHEN 1 THEN '' ELSE '√' END AS '是否必填', attr.DefaultValue '默認值', CASE attr.IsCustomField WHEN 1 THEN '√' ELSE '' END AS '是否爲自定義字段', CASE attr.IsPKAttribute WHEN 1 THEN '√' ELSE '' END AS '是否爲主鍵', (SELECT TOP 1 lab.Label FROM MetadataSchema.LocalizedLabel AS lab WHERE attr.AttributeId = lab.ObjectId ORDER BY lab.LabelTypeCode) AS '字段說明', CASE WHEN tps.Description NOT IN ( 'picklist', 'state', 'status', 'multiselectpicklist' ) THEN '' ELSE Stuff((SELECT ',' + CONVERT(VARCHAR(100), sm.AttributeValue) + ':' + sm.Value FROM StringMap sm WHERE ent.ObjectTypeCode = sm.ObjectTypeCode AND attr.Name = sm.AttributeName FOR XML PATH('')), 1, 1, '') END AS '選項說明' FROM MetadataSchema.Entity AS ent JOIN MetadataSchema.Attribute AS attr ON ent.EntityId = attr.EntityId JOIN MetadataSchema.AttributeTypes AS tps ON attr.AttributeTypeId = tps.AttributeTypeId WHERE ent.Name IN ( 'new_store' ) --篩選表名 --AND attr.IsCustomField = 1 --篩選自定義字段 ORDER BY ent.Name, attr.Name
結果