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

SQL Server生成XML时&被转义为&的问题解决指导

问题解析与解决方法

首先明确:XML规范要求特殊字符(&、<、>、"、')必须转义,所以FOR XML PATH生成的XML中&被转义为&amp;是符合XML标准的正常行为,并非代码错误。

正确获取原始内容的方法

如果你需要得到未转义的原始文本(如Horse & Horse),不要直接查看XML的字符串形式,而是通过XML的.value()方法提取节点内容,SQL代码示例如下:

-- 先将XML结果存入变量
DECLARE @resultXML XML = (
    SELECT 
        CASE WHEN changed=0 THEN 'False' WHEN changed=1 THEN 'True' ELSE NULL END AS "@changed",
        Name AS 'Name', 
        Integer AS 'Value/Integer',
        Decimal AS 'Value/Decimal',
        Dimensions AS 'Value/Dimensions',
        Units AS 'Value/Units',
        Percentage AS 'Value/Percentage',
        code AS 'Value/code',
        text AS 'Value/text',
        CASE WHEN boolean=0 THEN 'False' WHEN boolean=1 THEN 'True' ELSE NULL END AS 'Value/boolean'
    FROM [abc].[xyz_detail_table](NOLOCK) CD 
    WHERE code_ids='268973407' 
    FOR XML PATH('Detail'), TYPE
);

-- 提取Value/text节点的原始内容
SELECT @resultXML.value('(/Detail/Value/text)[1]', 'varchar(254)') AS OriginalText;

执行上述代码后,OriginalText字段会返回Horse & Horse,自动还原转义字符。

特殊需求:生成包含未转义&的XML(不推荐)

如果业务场景确实需要XML中直接显示&而非转义后的&amp;,可以用CDATA段包裹文本(但会导致XML节点内容变为CDATA格式,且若文本包含]]>会破坏结构),修改后的SQL如下:

SELECT 
    CASE WHEN changed=0 THEN 'False' WHEN changed=1 THEN 'True' ELSE NULL END AS "@changed",
    Name AS 'Name', 
    Integer AS 'Value/Integer',
    Decimal AS 'Value/Decimal',
    Dimensions AS 'Value/Dimensions',
    Units AS 'Value/Units',
    Percentage AS 'Value/Percentage',
    code AS 'Value/code',
    '<![CDATA[' + text + ']]>' AS 'Value/text',
    CASE WHEN boolean=0 THEN 'False' WHEN boolean=1 THEN 'True' ELSE NULL END AS 'Value/boolean'
FROM [abc].[xyz_detail_table](NOLOCK) CD 
WHERE code_ids='268973407' 
FOR XML PATH('Detail'), TYPE;

注意:这种方式生成的XML虽然能显示未转义的&,但不符合严格的XML内容规范,仅建议在特殊兼容场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:57:23