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

如何将SQL Server中FOR XML PATH转换为STRING_AGG?

正确转换为STRING_AGG的写法

首先明确你原来的FOR XML PATH + STUFF语句的作用:将CTE中去重后的[Column]值,用@delimiter作为分隔符拼接成一个字符串,STUFF是用来移除开头多余的第一个分隔符。

你当前的STRING_AGG写法参数顺序完全错误,STRING_AGG的标准语法是:

STRING_AGG(expression, separator) [WITHIN GROUP (ORDER BY expression [ASC|DESC])]

正确的转换写法

方法1:先去重再拼接(和原逻辑完全对齐)

原语句通过GROUP BY [Column]实现去重,对应到STRING_AGG可以先子查询去重,再拼接:

SELECT STRING_AGG([Column], @delimiter)
FROM (
    SELECT DISTINCT [Column]
    FROM CTE
) AS UniqueCols

方法2:直接在STRING_AGG中使用DISTINCT(SQL Server 2017+支持)

如果你的SQL Server版本是2017及以上,可以直接在STRING_AGG里用DISTINCT简化写法,效果和上面一致:

SELECT STRING_AGG(DISTINCT [Column], @delimiter)
FROM CTE

为什么你的写法不对?

你写的STRING_AGG('', @delimiter, '', [Column] )完全不符合语法规范:

  • STRING_AGG只需要两个必填参数:第一个是要拼接的字段(这里是[Column]),第二个是分隔符(@delimiter)
  • 不需要额外的空字符串参数
  • 另外,原语句的GROUP BY [Column]是为了去重,不是分组拼接(如果是分组拼接逻辑完全不同),所以你的写法里保留GROUP BY [Column]会导致每个分组只返回单个值,失去拼接意义。

另外,STRING_AGG不会像FOR XML PATH那样在开头多生成一个分隔符,所以不需要再用STUFF处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:21:23