如何阻止Azure Data Explorer推断函数数组参数的数据类型?
解决方案
问题核心是ADX的dynamic类型会自动推断数组元素的类型,时间戳格式的字符串会被解析为timestamp类型,而你的MyTable.Value是字符串类型,类型不匹配导致查询无预期结果。
以下两种方案可解决该问题:
方案一:强制转换数组元素为字符串
使用array_transform函数遍历动态数组,将每个元素强制转为字符串后再用于in条件:
let SelectedValues = dynamic(["2022-08-14T13:05:17Z", "EconChgOvrDiff", "1"]); let F = (SelectedValues:dynamic=dynamic([]), Limit:int=100) { let stringValues = array_transform(SelectedValues, x => tostring(x)); MyTable | where Value in (stringValues) | limit Limit }; F(SelectedValues)
原理
array_transform(SelectedValues, x => tostring(x))会遍历输入数组,将所有元素统一转换为字符串类型,确保和MyTable.Value的类型完全匹配,消除类型推断带来的差异。
方案二:指定参数为字符串数组类型
直接将函数参数定义为array<string>类型,从根源避免ADX自动推断元素类型:
let SelectedValues = dynamic(["2022-08-14T13:05:17Z", "EconChgOvrDiff", "1"]); let F = (SelectedValues:array<string>=dynamic([]), Limit:int=100) { MyTable | where Value in (SelectedValues) | limit Limit }; F(SelectedValues)
原理
当传入dynamic类型数组到array<string>参数时,ADX会自动将每个元素转换为对应的字符串表示(比如timestamp类型会转为原时间格式的字符串),完全符合你的需求。
内容的提问来源于stack exchange,提问作者Nestor Mendez
相关产品推荐
相关产品推荐

