Kusto(KQL)查询如何提取JSON字符串值并动态拆分为新行
Kusto 拆分JSON数组生成多行数据实现方案
需求背景
SQLTriggerViolations 表的DBInfo列存储JSON格式的数组字符串,单行示例值:
[{"DBName":"master","TriggerName":"ramp_sqlpreventivetrigger_sqlserver_v01","TriggerStateDB":"Enabled"},{"DBName":"master","TriggerName":"No Trigger","TriggerStateDB":"No Trigger"}]
单行列内包含多组数据库触发器配置,需要将单行内嵌的多组数据拆分为独立多行展示,提取每组对应的字段值。
原有代码错误点
- 手动用
substring、trim移除字符串首尾[]的操作完全多余,parse_json原生支持直接解析标准JSON数组 - 去掉
[]后得到的是多个JSON对象拼接的字符串,不是单个JSON对象,直接读取.TriggerName属性无法获取有效值 - 缺少数组展开步骤,无法将单行列内存储的多个数组元素拆分为独立行
可直接运行的正确查询
不需要手动处理JSON格式符号,直接解析后用mv-expand展开数组即可:
SQLTriggerViolations | where TriggerStatus != "Enabled" | where ServerName == 'ServerName' | project ServerName, DBInfo // 将JSON格式字符串直接解析为动态类型数组 | extend DBInfoParsed = parse_json(DBInfo) // 遍历数组,将每个JSON对象展开为独立行 | mv-expand DBInfoItem = DBInfoParsed // 从展开的单个对象中提取目标字段 | extend DBName = tostring(DBInfoItem.DBName), TriggerName = tostring(DBInfoItem.TriggerName), TriggerStateDB = tostring(DBInfoItem.TriggerStateDB) // 保留最终需要的输出列 | project ServerName, DBName, TriggerName, TriggerStateDB
补充说明:提取字段时加tostring()转换是为了避免动态类型带来的后续查询异常,输出值和原始JSON中存储的内容完全一致。
执行效果
原本包含2组触发器配置的单行数据,执行后会拆分为2条独立记录,每条记录对应一组触发器的配置信息,完全匹配预期的拆分需求。
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

