sql >> Databáze >  >> RDS >> Sqlserver

přidání informací o kódování k výsledku FOR XML

Jak zdůrazňuje @gbn v jiné odpovědi a na další dotaz , "data XML jsou interně uložena jako ucs- 2 ", a SQL Server jej při vytváření dat nezahrnuje. Můžete však převést XML na řetězec a připojit deklaraci XML na začátek ručně. Pouhé použití UTF-8 v deklaraci by však bylo nepřesné. Řetězec Unicode, který SQL vytváří, je v UCS-2. Například toto selže:

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

s chybou:

Na druhou stranu to bude fungovat podle očekávání:

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

Zde je kód, který vytvoří úplný řetězec XML s deklarací, který hledáte pro vaše vzorová data:

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;


  1. json sloupec vs více sloupců

  2. Jak přidat záhlaví a zápatí do sestavy v aplikaci Access

  3. Upozornění, když někdo nahraje video

  4. Zabránit vícenásobnému přihlášení stejného uživatele v aplikaci pro stolní počítače