我正在尝试在SQL Server中包含一个包含重音字符(特别是急性e)的字符串,并在使用FOR XML PATH时正确转换,如下所示:
SELECT 'é' AS Accent
FOR XML PATH('')
/* Produces: <Accent>é</Accent> */
但是,它总是带有重音,或者尝试转换其他字符。这是我到目前为止所尝试的:
SELECT 'é' AS Accent
FOR XML PATH('')
/* Produces: <Accent>é</Accent> */
SELECT N'é' AS Accent
FOR XML PATH('')
/* Produces: <Accent>é</Accent> */
SELECT REPLACE('é', 'é', 'é') AS Accent
FOR XML PATH('')
/* Produces: <Accent>&eacute;</Accent> */
SELECT '<![CDATA[' + 'é' + ']]>' AS Accent
FOR XML PATH('')
/* Produces: <Accent><![CDATA[é]]></Accent> */
SELECT CAST('<![CDATA[' + 'é' + ']]>' AS XML) AS Accent
FOR XML PATH('')
/* Produces: <Accent>é</Accent> */
我已经找了很长时间,除了将最终结果XML转换为字符串并手动替换字符之外找不到任何东西 - 我正在寻找一种更正确的方法来做到这一点。这只是SQL Server中的一个错误吗?它似乎转换了很多其他字符(&lt;,&gt;,&amp;,etc等)。
提前感谢任何帮助。
我正在使用SQL Server 2008。
答案 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)),'é', 'é') --<Accent>é</Accent>
- 尝试将此结果转换回XML失败
SELECT CAST(REPLACE(CAST(@xml AS NVARCHAR(MAX)),'é', 'é') AS XML);
XML解析:第1行,第16个字符,格式正确的检查:未声明的实体
Obvioulsy SQL Server的XML引擎甚至不知道这个实体...