将表行转换为含特殊字符的完整XML,避免重复转义
解决SQL生成XML时特殊字符重复转义的问题
嘿,我之前也碰到过这个坑,来给你拆解下问题和解决方案:
问题根源
你现在看到的&amp;是双重转义搞出来的鬼:你插入数据的时候已经手动把&写成了&,而SQL Server的FOR XML PATH机制本身会自动对XML特殊字符(&、<、>这些)进行转义,所以原来&里的&又被转了一次,就变成了&amp;。
最省心的解决办法
其实完全不需要手动提前转义&!直接插入原始的&字符,FOR XML会自动帮你处理成符合XML规范的&:
DECLARE @x TABLE (Name VARCHAR(20), Address VARCHAR(20), Phone VARCHAR(20)) -- 直接用原始的&,不用手动转成& INSERT INTO @x VALUES ('Ben & Eileen Dover','5 Curdsan Way','123-456-7890') SELECT [MyField] = (SELECT * FROM @x FOR XML PATH('Customer'), TYPE)
执行这段代码,生成的XML里&会被正确转成&,不会有重复转义的问题。
如果必须保留已转义的数据怎么办?
要是因为数据来源的限制,你没法修改插入的内容(比如数据本身就是带&的),那可以用XML类型的.value()方法来反转义一次,注意要写对路径:
DECLARE @x TABLE (Name VARCHAR(20), Address VARCHAR(20), Phone VARCHAR(20)) INSERT INTO @x VALUES ('Ben & Eileen Dover','5 Curdsan Way','123-456-7890') SELECT [MyField] = CAST( -- 先把XML转成字符串,此时&amp;会变回& (SELECT * FROM @x FOR XML PATH('Customer'), TYPE).value('.', 'NVARCHAR(MAX)') AS XML) -- 再重新转成XML类型,得到正确的转义结果
这里用.作为.value()的路径,是获取整个XML的字符串表示,这样反转义后再转成XML,就能得到正确的结果了。
为什么你之前用.value()没生效?
估计是你指定的节点路径不对,比如只取了某个子节点的文本,没覆盖到所有内容。用.作为路径就能拿到整个XML的内容,再重新转换就解决问题啦。
内容的提问来源于stack exchange,提问作者PacerDawn
相关产品推荐
相关产品推荐

