SQL Server 2019 FOR XML PATH非ASCII及特殊字符重复编码问题求解
解决方案
核心原因是你手动提前做了XML转义,而FOR XML ... TYPE本身会自动对输入的字符串内容做XML标准转义,两次转义叠加就出现了'这类不符合要求的内容。按如下步骤调整即可:
- 第一步:删除你自定义的
[dbo].[encodeXML]转义函数,所有字段直接使用原始值传入查询即可,FOR XML会自动处理&、"、<、>、'以及ä、å等非ASCII字符的转义兼容。 - 第二步:嵌套
FOR XML查询时,必须给内层查询加上TYPE关键字,让内层返回原生XML类型而非字符串类型,外层查询处理XML类型字段时不会将其当做普通字符串二次转义。
示例代码
-- 两层FOR XML嵌套的正确写法 SELECT WaybillNo, -- 运单号原始值 SenderName, -- 发件人原始值 -- 内层生成Parcel节点集合,返回XML类型 ( SELECT ParcelSN, ReceiverAddress, -- 地址直接放原始值,不需要手动转义 Weight FROM ParcelTable p WHERE p.WaybillId = w.WaybillId FOR XML PATH('Parcel'), TYPE -- TYPE关键字必须保留 ) AS ParcelList FROM WaybillTable w FOR XML PATH('Info'), TYPE -- 外层也使用TYPE保证输出格式正确
效果验证
当地址字段原始值为Quartu Sant'Elena时,最终生成的XML中对应内容为Quartu Sant'Elena,不会出现二次转义问题,所有特殊字符和非ASCII字符都会按XML规范正确处理。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

