SQL Server 2017 STRING_AGG使用WITHIN GROUP排序报语法错误
错误产生原因
你当前使用的SQL Server 2017实例版本为14.0.2037.2,属于RTM-GDR分支,仅安装了安全类补丁,未安装功能累积更新:
- STRING_AGG函数在SQL Server 2017 RTM初始版本中就已上线,因此不带排序的基础聚合查询可以正常执行
- STRING_AGG配套的
WITHIN GROUP排序子句是在SQL Server 2017 CU1(累积更新1,版本号14.0.3006.16)中才新增的功能,你当前的实例版本未包含该功能实现,因此解析到WITHIN GROUP语法时会抛出102号语法错误。
正确实现方案
你可以根据实际环境选择以下两种方案实现排序拼接:
方案1:升级实例补丁(推荐,原生语法支持)
直接为SQL Server 2017实例安装CU1及以上版本的累积更新(建议安装最新累积更新获得完整功能与bug修复),补丁安装完成后重启实例,即可使用标准的WITHIN GROUP语法实现排序聚合,语句如下:
SELECT STRING_AGG(Category,', ') WITHIN GROUP (ORDER BY Category ASC) AS Result FROM LegacyReviews_Categories
方案2:不升级补丁的兼容写法
如果暂时无法调整实例补丁版本,可以通过子查询先排序再聚合的方式实现相同效果,使用OFFSET 0 ROWS固定子查询排序结果,避免优化器忽略排序逻辑,语句如下:
SELECT STRING_AGG(Category,', ') AS Result FROM ( SELECT Category FROM LegacyReviews_Categories ORDER BY Category ASC OFFSET 0 ROWS ) AS sorted_temp
该写法在你当前的RTM版本中可以正常执行,返回结果和原生WITHIN GROUP语法完全一致。
内容的提问来源于stack exchange,提问作者evanburen
相关产品推荐
相关产品推荐

