Power Query Editor正常运行的SQL在Power BI应用时报语法错误如何解决
问题解决方案
错误根因
你遇到的报错由两个原因共同导致:
- Power BI在DirectQuery模式下执行自定义SQL时,会自动将你写的SQL作为子查询包裹在外层查询语句中,格式为
SELECT * FROM (你的自定义SQL) AS t,你写的SQL开头的;会直接出现在子查询内部开头,不符合SQL语法规范。 - 你的SQL语句本身存在字段引用错误:CTE
b的SELECT列表中包含ProjectPhaseId字段,但CTEa的查询结果中并没有返回该字段,执行时也会触发语法错误。
解决步骤
- 第一步:删掉SQL开头的多余分号
; - 第二步:修正字段引用错误,要么在CTE
a的SELECT子句中添加pd.[ProjectPhaseId](如果ProjectDollars表存在该字段),要么直接删除CTEb的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
相关产品推荐
相关产品推荐

