SQL Server 2019执行分区聚合查询报PDW功能未启用错误
问题成因
你查到的SQL Server 2008触发该报错的场景,是窗口函数首次引入阶段的旧版解析器bug,但SQL Server 2019环境下触发这个报错和旧版原生bug无关,常见触发原因有三个:
- 数据库兼容级别配置错误:如果当前查询的数据库是从低版本SQL Server附加/还原到2019实例,兼容级别停留在100(对应SQL Server 2008版本),解析器会沿用旧版本的校验逻辑,把带ORDER BY的分区聚合窗口函数误判定为PDW专属功能。
- 语句写法触发解析器异常分支:你的
OVER()子句中,PARTITION BY已经指定按dea.location分区,同分区下的dea.location值完全一致,但你在ORDER BY中重复写入了dea.location字段,这个冗余写法会触发部分补丁版本的SQL Server 2019解析器异常,错误拉起PDW功能校验逻辑。 - 连接配置错误:如果连接实例时选用了Azure Synapse Analytics(原SQL PDW)的驱动选项,或是本地实例残留了PDW组件配置,普通查询语句会被路由到PDW解析引擎,未启用PDW特性时就会抛出该错误。
解决方案
按优先级依次尝试以下操作即可:
- 先修正语句的冗余写法,删除
OVER()子句ORDER BY中重复的分区字段,修改后的完整语句如下:
SELECT dea.continent, dea.location, dea.date, dea.population, vac.new_vaccinations ,SUM(CONVERT(bigint, vac.new_vaccinations)) OVER (Partition BY dea.location ORDER BY dea.date) AS RollingPeopleVaccinated --,(RollingPeopleVaccinated/dea.population)*100 FROM CovidDeaths dea JOIN CovidVaccinations vac ON dea.location = vac.location AND dea.date = vac.date WHERE dea.continent is not null ORDER BY 2,3
该修改不会改变窗口函数的计算逻辑,分区字段本身已经锁定了计算范围,重复加入排序字段没有实际意义。
- 检查并修正数据库兼容级别,先执行以下语句查询当前数据库的兼容级别:
SELECT compatibility_level FROM sys.databases WHERE name = '替换为你实际查询的数据库名'
如果返回结果为100,执行以下语句将兼容级别升级到SQL Server 2019对应的150:
ALTER DATABASE 替换为你实际查询的数据库名 SET COMPATIBILITY_LEVEL = 150;
- 如果前两步操作后仍报错,检查数据库连接配置:确认你连接的是常规SQL Server 2019数据库引擎实例,不是Azure Synapse专用SQL池,连接字符串中也没有添加PDW相关的扩展参数。
内容的提问来源于stack exchange,提问作者RAB
相关产品推荐
相关产品推荐

