正如 @gbn 中指出的另一个答案 and on 另一个问题, "XML 数据在内部存储为 ucs-2",并且 SQL Server 在生成数据时不包含它。但是,您可以将 XML 转换为字符串并手动在开头附加 XML 声明。但是,在声明中简单地使用 UTF-8 是不准确的。 SQL 生成的 Unicode 字符串是 UCS-2 格式的。例如,这将失败:
SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
有错误:
消息 9402,级别 16,状态 1,第 1 行 XML 解析:第 1 行,字符 38,
无法切换编码
另一方面,这将按预期工作:
SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
下面的代码将生成您为示例数据寻找的完整的、包含声明的 XML 字符串:
DECLARE @Agents TABLE
(
AgentID int,
AgentName nvarchar(50),
AgentLocation nvarchar(100)
);
INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (1, N'Mike', N'Sanfrancisco');
INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (2, N'John', N'NY');
WITH BaseData AS
(
SELECT
(
SELECT
AgentID AS '@id',
AgentName AS 'Name',
AgentLocation AS 'Location'
FROM @Agents
FOR XML PATH('Agent'), ROOT('Agents'), TYPE
) AS AgentXML
), FullStringTable AS
(
SELECT
*,
'<?xml version="1.0" encoding="UCS-2"?>' +
CONVERT(nvarchar(max),AgentXML) AS FullString
FROM BaseData
)
SELECT
AgentXML AS OriginalXML,
FullString,
CONVERT(xml,FullString) AS FullStringConvertedToXML
FROM FullStringTable;