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

Power Query Editor正常运行的SQL在Power BI应用时报语法错误如何解决

问题解决方案

错误根因

你遇到的报错由两个原因共同导致:

  1. Power BI在DirectQuery模式下执行自定义SQL时,会自动将你写的SQL作为子查询包裹在外层查询语句中,格式为SELECT * FROM (你的自定义SQL) AS t,你写的SQL开头的;会直接出现在子查询内部开头,不符合SQL语法规范。
  2. 你的SQL语句本身存在字段引用错误:CTE b的SELECT列表中包含ProjectPhaseId字段,但CTE a的查询结果中并没有返回该字段,执行时也会触发语法错误。

解决步骤

  • 第一步:删掉SQL开头的多余分号;
  • 第二步:修正字段引用错误,要么在CTE a的SELECT子句中添加pd.[ProjectPhaseId](如果ProjectDollars表存在该字段),要么直接删除CTE b的SELECT列表中的ProjectPhaseId列。
  • 第三步(可选,推荐):将修正后的SQL创建为SQL Server的视图,Power BI直接对接该视图而非使用自定义SQL,能避免DirectQuery模式下Power BI自动包裹SQL导致的各类语法问题,同时查询性能更优。

修正后SQL示例

with a as (
       SELECT pd.[ProjectDollarsId]
       , pd.[VersionId]
       , pd.[ProjectId]
       , pd.[FundTypeId]
       , pd.[ApprovalId]
       , pd.[PriorDollar]
       , pd.[LastYearDollar]
       , pd.[ThisYearDollar]
       , pd.[NextYearDollar]
       , pd.[FutureDollar]
       , pd.[TotalDollar]
       -- 如果你需要ProjectPhaseId字段,取消下面这行的注释
       -- , pd.[ProjectPhaseId]
       , v.[Year] as VersionYear

       FROM [ProjectDollars] pd
         inner join [Version] v on v.VersionId = pd.VersionId

       where v.[Year] > 2016
), 
b as (
       select ProjectDollarsId
       , VersionId
       , ProjectId
       -- 如果你在CTE a里添加了ProjectPhaseId,取消下面这行的注释
       -- , ProjectPhaseId
       , FundTypeId
       , ApprovalId
       , VersionYear
       , DollarsYear
       , Dollars

       from a pvt
       unpivot (
              Dollars for DollarsYear in (
                     PriorDollar, 
                     LastYearDollar, 
                     ThisYearDollar, 
                     NextYearDollar, 
                     FutureDollar)
              ) as unpvt
)

select ProjectDollarsId
, VersionId
, ProjectId
, FundTypeId
, ApprovalId
, case DollarsYear
       when 'PriorDollar'    then VersionYear - 2
       when 'LastYearDollar' then VersionYear - 1
       when 'ThisYearDollar' then VersionYear
       when 'NextYearDollar' then VersionYear + 1
       when 'FutureDollar'   then VersionYear + 2
    else 0
  end as [Year]
, Dollars
from b

修正后先在SQL Server Management Studio中执行SQL确认无报错,再放回Power BI中重新加载即可。

内容的提问来源于stack exchange,提问作者dougp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 00:15:07