You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:39:39