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

将表行转换为含特殊字符的完整XML,避免重复转义

解决SQL生成XML时特殊字符重复转义的问题

嘿,我之前也碰到过这个坑,来给你拆解下问题和解决方案:

问题根源

你现在看到的&amp;amp;是双重转义搞出来的鬼:你插入数据的时候已经手动把&写成了&amp;,而SQL Server的FOR XML PATH机制本身会自动对XML特殊字符(&、<、>这些)进行转义,所以原来&amp;里的&又被转了一次,就变成了&amp;amp;。

最省心的解决办法

其实完全不需要手动提前转义&!直接插入原始的&字符,FOR XML会自动帮你处理成符合XML规范的&amp;:

DECLARE @x TABLE (Name VARCHAR(20), Address VARCHAR(20), Phone VARCHAR(20))
-- 直接用原始的&,不用手动转成&amp;
INSERT INTO @x VALUES ('Ben & Eileen Dover','5 Curdsan Way','123-456-7890')
SELECT [MyField] = (SELECT * FROM @x FOR XML PATH('Customer'), TYPE)

执行这段代码,生成的XML里&会被正确转成&amp;,不会有重复转义的问题。

如果必须保留已转义的数据怎么办?

要是因为数据来源的限制,你没法修改插入的内容(比如数据本身就是带&amp;的),那可以用XML类型的.value()方法来反转义一次,注意要写对路径:

DECLARE @x TABLE (Name VARCHAR(20), Address VARCHAR(20), Phone VARCHAR(20))
INSERT INTO @x VALUES ('Ben &amp; Eileen Dover','5 Curdsan Way','123-456-7890')
SELECT [MyField] = CAST(
    -- 先把XML转成字符串,此时&amp;amp;会变回&amp;
    (SELECT * FROM @x FOR XML PATH('Customer'), TYPE).value('.', 'NVARCHAR(MAX)')
    AS XML) -- 再重新转成XML类型,得到正确的转义结果

这里用.作为.value()的路径,是获取整个XML的字符串表示,这样反转义后再转成XML,就能得到正确的结果了。

为什么你之前用.value()没生效?

估计是你指定的节点路径不对,比如只取了某个子节点的文本,没覆盖到所有内容。用.作为路径就能拿到整个XML的内容,再重新转换就解决问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:39:31