如何使用FOR XML

时间:2017-02-24 17:23:33

标签: sql-server xml encoding for-xml-path

我正在尝试在SQL Server中包含一个包含重音字符(特别是急性e)的字符串,并在使用FOR XML PATH时正确转换,如下所示:

SELECT 'é' AS Accent
FOR XML PATH('')

/* Produces: <Accent>&eacute;</Accent> */

但是,它总是带有重音,或者尝试转换其他字符。这是我到目前为止所尝试的:

SELECT 'é' AS Accent
FOR XML PATH('')

/* Produces: <Accent>é</Accent> */

SELECT N'é' AS Accent
FOR XML PATH('')

/* Produces: <Accent>é</Accent> */

SELECT REPLACE('é', 'é', '&eacute;') AS Accent
FOR XML PATH('')

/* Produces: <Accent>&amp;eacute;</Accent> */

SELECT '<![CDATA[' + 'é' + ']]>' AS Accent
FOR XML PATH('')

/* Produces: <Accent>&lt;![CDATA[é]]&gt;</Accent> */

SELECT CAST('<![CDATA[' + 'é' + ']]>' AS XML) AS Accent
FOR XML PATH('')

/* Produces: <Accent>é</Accent> */

我已经找了很长时间,除了将最终结果XML转换为字符串并手动替换字符之外找不到任何东西 - 我正在寻找一种更正确的方法来做到这一点。这只是SQL Server中的一个错误吗?它似乎转换了很多其他字符(&lt;,&gt;,&amp;,etc等)。

提前感谢任何帮助。

我正在使用SQL Server 2008。

1 个答案:

答案 0 :(得分:1)

我不确定,但我认为,如果没有黑客攻击,这是不可能的。

SQL-Server在内部将XML视为2字节utf-16。因此,在此范围内可显示的所有字符都不需要转义。

当涉及具有声明性含义的不可打印的字符或字母时,这是另一回事,如<, > and &或引号(在某些情况下)。

我可能会使用强制转换为NVARCHAR(MAX),然后在导出此数据的位置使用字符串级别替换。您无法将其转换回XML:

- 将测试XML推送到变量

DECLARE @xml XML=
(
    SELECT 'é' AS Accent
    FOR XML PATH('')
);
SELECT @xml; --<Accent>é</Accent>

- 将其投射到字符串并在字符串级别

上进行替换
SELECT REPLACE(CAST(@xml AS NVARCHAR(MAX)),'é', '&eacute;') --<Accent>&eacute;</Accent>

- 尝试将此结果转换回XML失败

SELECT CAST(REPLACE(CAST(@xml AS NVARCHAR(MAX)),'é', '&eacute;') AS XML); 
  

XML解析:第1行,第16个字符,格式正确的检查:未声明的实体

Obvioulsy SQL Server的XML引擎甚至不知道这个实体...