如何将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
相关产品推荐
相关产品推荐

