Power BI编写M代码遇循环引用Expression.Error错误如何解决
问题报错场景
在Power BI中使用M语言编写Power Query逻辑运行时,触发如下报错:
Expression.Error: A cyclic reference was encountered during evaluation
触发报错的原始代码:
Table.AddColumn(#"Inserted Month Name", "Custom", each if [Fiscal Year]= List.Max(#"dim_date"[Fiscal Year]) then "Y" else "N")
报错根因
该问题属于典型的M语言循环引用错误:
当这段新增列的代码写在dim_date表自身的查询步骤中时,each后的行迭代逻辑直接引用了dim_date表的完整列做聚合计算。此时dim_date表还处于构造过程中,新列的计算需要依赖dim_date的完整数据,而dim_date的最终输出又必须等新列计算完成才能生成,二者形成依赖闭环,引擎直接抛出循环引用错误。
排查解决方法
按以下优先级排查处理:
- 优先确认代码所在查询位置
检查这段Table.AddColumn逻辑是否属于dim_date查询的内部步骤,绝大多数同场景报错都属于该情况。此时不要直接引用最终表名dim_date,也不要把聚合计算放在行迭代逻辑内执行。 - 抽离固定计算值打破循环
把需要聚合的最大财年值作为单独的步骤变量提前计算,计算时引用上一个已经处理完成的步骤表(即代码里的#"Inserted Month Name"),而非未构造完成的最终表,再传入新增列的判断逻辑。修改后的可运行参考代码:let // 保留原有已执行的步骤,例如生成#"Inserted Month Name"的相关步骤 // 提前单独计算最大财年标量值,基于上一步已生成的表计算,无循环依赖 CalcMaxFiscalYear = List.Max(#"Inserted Month Name"[Fiscal Year]), // 新增列时直接调用提前算好的固定值做判断 #"Added Custom Column" = Table.AddColumn(#"Inserted Month Name", "Custom", each if [Fiscal Year] = CalcMaxFiscalYear then "Y" else "N") in #"Added Custom Column" - 跨查询循环依赖排查
如果代码不在dim_date自身的查询内,打开Power Query编辑器的「视图」选项卡,选择「查询依赖」功能,检查是否存在A查询引用dim_date、dim_date又反过来引用A查询的链路闭环。遇到该情况时,把两个查询共同依赖的公共计算逻辑抽成独立的第三方查询,打断环形依赖链路即可。
内容的提问来源于stack exchange,提问作者Arijit Nayak
相关产品推荐
相关产品推荐

