如何在ADF的Power Query中将单元格值作为查询let语句参数
核心问题:能否将单元格中名为LKP_Value的值作为后续查询let语句的一部分?
背景详情
已提取出一个单元格的值并命名为LKP_Value,该值是一系列经过验证的Table.AddColumn函数(此前在Power Query中编写并复制到查找表),用于按范围添加列,示例如下:
" Table.AddColumn(Source, ""SURVEY_COLUMN_1"", each Text.Middle([Column1], 0,2), type text) , #""Inserted text range 1"" = Table.AddColumn(#""Inserted text range"", ""SURVEY_COLUMN_2"", each Text.Middle([Column1], 3,2), type text) .....in #""Removed columns"""
可将完整let语句存入LKP_Value单元格,期望通过动态配置实现查询。尝试以下写法但未成功:
let Source = #"SOURCE_LKP_FILE", Source2 = #"SURVEY_PARAMS", #"Inserted text range" = #"LKP_Value" in #"Removed columns"
期望LKP_Value解析后,查询语句如下:
let Source = #"SOURCE_LKP_FILE", Source2 = #"SURVEY_PARAMS", #"Inserted text range" = Table.AddColumn(Source, "SURVEY_COLUMN_1", each Text.Middle([Column1], 0,2), type text) , #"Inserted text range 1" = Table.AddColumn(#"Inserted text range", "SURVEY_COLUMN_2", each Text.Middle([Column1], 3,4), type text) , #"Removed columns" = Table.RemoveColumns(#"Inserted text range 1", {"Column1"}) in #"Removed columns"
可行方案
直接将LKP_Value(字符串类型)赋值给查询步骤行不通,因为Power Query会把它当作纯文本,而非可执行的M代码。要实现动态执行单元格中的代码,需使用Expression.Evaluate函数解析并运行字符串形式的M代码,同时传递必要的上下文环境,让动态代码能访问查询中的变量。
具体实现步骤
- 清理
LKP_Value格式:如果单元格中的代码带有前后引号或多余空格,先做清理:
CleanedLKPValue = Text.Trim(LKP_Value, "\" "), // 移除前后的引号和空格
- 执行动态代码:将清理后的代码传入
Expression.Evaluate,并传递当前查询中的所有变量作为环境参数,确保动态代码能正确引用这些变量:
let Source = #"SOURCE_LKP_FILE", Source2 = #"SURVEY_PARAMS", // 清理单元格中的代码文本 CleanedLKPValue = Text.Trim(LKP_Value, "\" "), // 动态执行代码,传递上下文环境 DynamicQueryResult = Expression.Evaluate( CleanedLKPValue, [ Source = Source, Source2 = Source2, #"SOURCE_LKP_FILE" = #"SOURCE_LKP_FILE", #"SURVEY_PARAMS" = #"SURVEY_PARAMS" ] ) in DynamicQueryResult
注意事项
- 确保
LKP_Value中的代码是有效的M语言代码片段,语法完全符合Power Query要求,否则会执行失败。 - 动态代码中用到的所有变量(比如后续步骤引用的
#"Inserted text range"),要么在环境参数中定义,要么在动态代码内部完成赋值,否则会出现变量未定义的错误。 - 如果
LKP_Value中包含完整的let...in语句,Expression.Evaluate会直接返回in后面的结果,无需额外处理。
内容的提问来源于stack exchange,提问作者Christopher Fowler
相关产品推荐
相关产品推荐

