如何使用 FOR XML 正确转换重音字符
How to properly convert accented characters using FOR XML
我正在尝试在 SQL 服务器中获取一个包含重音字符(特别是尖音符 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 服务器中的一个错误吗?它似乎可以转换大量其他字符(<、>、& 等...)。
非常感谢您的帮助。
我正在使用 SQL Server 2008。
我不确定,但我假设,如果没有黑客,这是不可能的。
SQL-服务器在内部将 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 parsing: line 1, character 16, well formed check: undeclared entity
很明显 SQL 服务器的 XML 引擎甚至不知道这个实体...
我正在尝试在 SQL 服务器中获取一个包含重音字符(特别是尖音符 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 服务器中的一个错误吗?它似乎可以转换大量其他字符(<、>、& 等...)。
非常感谢您的帮助。
我正在使用 SQL Server 2008。
我不确定,但我假设,如果没有黑客,这是不可能的。
SQL-服务器在内部将 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 parsing: line 1, character 16, well formed check: undeclared entity
很明显 SQL 服务器的 XML 引擎甚至不知道这个实体...