Zoals @gbn aangeeft in een ander antwoord en op een andere vraag , "de XML-gegevens worden intern opgeslagen als ucs- 2 ", en SQL Server neemt het niet op bij het produceren van de gegevens. U kunt de XML echter converteren naar een tekenreeks en de XML-declaratie aan het begin handmatig toevoegen. Het zou echter onnauwkeurig zijn om UTF-8 in de declaratie te gebruiken. Unicode-tekenreeks die SQL produceert, bevindt zich in UCS-2. Dit zal bijvoorbeeld mislukken:
SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
met fout:
Dit, aan de andere kant, zal werken zoals verwacht:
SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
Hier is de code die de volledige, met aangifte beladen XML-string zal produceren die u zoekt voor uw voorbeeldgegevens:
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;