KQL运行时动态向Find In运算符传递表列表的实现咨询
实现方案
ADX的KQL查询在编译阶段就需要确定要访问的表名,无法直接将运行时查询得到的表名列表直接传入find的in子句,可通过以下两种方式实现需求:
方案1:Union预筛选(无需额外工具,可直接在ADX界面运行)
先查询得到目标表名的动态数组,再通过union全表后筛选对应表名的方式实现,和手动指定find in效果一致:
// 定义目标表名动态集合 let targetTables = toscalar( Usage | where TimeGenerated > ago(32d) | where StartTime >= startofday(ago(31d)) and EndTime < startofday(now()) | where IsBillable == true | summarize BillableDataGB = sum(Quantity) / 1000 by DataType | sort by BillableDataGB desc | summarize make_list(DataType) ); // 执行查询逻辑,仅扫描目标表 union withsource=DataType * where TimeGenerated > ago(31d) | where DataType in (targetTables) | project _ResourceId, _BilledSize, _IsBillable | where _IsBillable == true | summarize BillableDataBytes = sum(_BilledSize) by _ResourceId, DataType | sort by BillableDataBytes nulls last
如果你的库中表数量较多,可以缩小union的扫描范围,比如只匹配日志类表前缀:union withsource=DataType *AuditLogs,*Diagnostics,进一步提升查询性能。
方案2:动态拼接查询(适合自动化调用场景)
如果是通过SDK、PowerShell、工作流等自动化方式调用查询,可以分两步执行:
- 先执行表名查询,拿到逗号分隔的表名列表
- 将表名字符串拼接进
find语句的in子句,再执行最终查询
内容的提问来源于stack exchange,提问作者PankajSanwal
相关产品推荐
相关产品推荐

