SQL Server生成XML时&被转义为&的问题解决指导
问题解析与解决方法
首先明确:XML规范要求特殊字符(&、<、>、"、')必须转义,所以FOR XML PATH生成的XML中&被转义为&是符合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中直接显示&而非转义后的&,可以用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
相关产品推荐
相关产品推荐

