sql >> Databasteknik >  >> RDS >> Sqlserver

lägga till kodningsinformation till resultatet av FOR XML

Som @gbn påpekar i ett annat svar och på en annan fråga , "XML-data lagras internt som ucs- 2 ", och SQL Server inkluderar inte det när du producerar data. Du kan dock konvertera XML till en sträng och lägga till XML-deklarationen i början manuellt. Men att bara använda UTF-8 i deklarationen skulle vara felaktig. Unicode-sträng som SQL producerar finns i UCS-2. Detta kommer till exempel att misslyckas:

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

med fel:

Detta kommer å andra sidan att fungera som förväntat:

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

Här är kod som kommer att producera den fullständiga, deklarationsladdade XML-strängen du söker för dina exempeldata:

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. Docker-compose miljövariabler

  2. Varför körs den andra T-SQL-frågan mycket snabbare än den första när den anropas av Reporting Services 2005 i en webbapp

  3. Hur man undviker två olika trådar läser samma rader från DB (Hibernate och Oracle 10g)

  4. Anslut och bearbeta Oracle-data från Objective-C på Mac OS