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

如何将SQL中STRING_AGG替换为FOR XML PATH实现字符串拼接?

解决方法:用FOR XML PATH替换STRING_AGG实现字符串拼接

在SQL Server 2017之前的版本,没有STRING_AGG函数,我们可以用FOR XML PATH('')来模拟多行字符串拼接的效果。针对你的需求,修改后的子查询如下:

SELECT 
    cd.spot_contract_id,
    PortID = STUFF(
        (
            SELECT ' and ' + CAST(port_id AS VARCHAR)
            FROM cha_discharge_port cd2 WITH(NOLOCK)
            WHERE cd2.spot_contract_id = cd.spot_contract_id
            FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)'),
        1, 5, '' -- 移除开头多余的' and '
    )
FROM cha_discharge_port cd WITH(NOLOCK)
GROUP BY cd.spot_contract_id

完整的SQL查询代码

替换后的完整查询如下:

SELECT
    MarisCostNum = c.cost_id,
    SpotDischargePort = dp.portid,
FROM
    cos_middle_cost c WITH(NOLOCK)
LEFT JOIN 
    voy_voyage v WITH(NOLOCK) ON v.voyage_id = c.owner_id
LEFT JOIN 
    voy_voyage_spot vs WITH(NOLOCK) ON vs.voyage_id= v.voyage_id 
LEFT JOIN 
    cha_contract cha WITH(NOLOCK) ON cha.contract_id = vs.spot_contract_id
LEFT JOIN 
    (
        SELECT 
            cd.spot_contract_id,
            PortID = STUFF(
                (
                    SELECT ' and ' + CAST(port_id AS VARCHAR)
                    FROM cha_discharge_port cd2 WITH(NOLOCK)
                    WHERE cd2.spot_contract_id = cd.spot_contract_id
                    FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)'),
                1, 5, ''
            )
        FROM cha_discharge_port cd WITH(NOLOCK)
        GROUP BY cd.spot_contract_id
    ) dp ON dp.spot_contract_id = cha.contract_id

关键逻辑说明

  • FOR XML PATH(''):将子查询结果拼接成无标签的XML文本,实现字符串合并效果。
  • TYPE:确保返回XML类型,避免特殊字符(如&)被自动转义。
  • .value('.', 'NVARCHAR(MAX)'):把XML节点的内容提取为普通字符串。
  • STUFF:移除拼接后字符串开头多余的' and '(该字符串长度为5,因此从第1位开始删除5个字符)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:05:21