Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

ajouter des informations d'encodage au résultat de FOR XML

Comme le souligne @gbn dans une autre réponse et sur une autre question , "les données XML sont stockées en interne en tant que ucs- 2 ", et SQL Server ne l'inclut pas lors de la production des données. Cependant, vous pouvez convertir le XML en chaîne et ajouter manuellement la déclaration XML au début. Cependant, utiliser simplement UTF-8 dans la déclaration serait inexact. La chaîne Unicode produite par SQL se trouve dans UCS-2. Par exemple, cela échouera :

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));

avec erreur :

Ceci, en revanche, fonctionnera comme prévu :

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));

Voici le code qui produira la chaîne XML complète chargée de déclarations que vous recherchez pour vos exemples de données :

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;