sql >> Database teknologi >  >> RDS >> Sqlserver

tilføjelse af kodningsinformation til resultatet af FOR XML

Som @gbn påpeger i et andet svar og på et andet spørgsmål , "XML-dataene gemmes internt som ucs- 2 ", og SQL Server inkluderer det ikke, når dataene produceres. Du kan dog konvertere XML'en til en streng og tilføje XML-erklæringen manuelt i begyndelsen. Det ville dog være unøjagtigt at bruge UTF-8 i erklæringen. Unicode-streng, som SQL producerer, er i UCS-2. Dette vil f.eks. mislykkes:

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

med fejl:

Dette vil på den anden side fungere som forventet:

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

Her er kode, som vil producere den fulde, erklæringsbelastede XML-streng, du søger for dine eksempeldata:

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. Skal du altid bruge coalesce i en WHERE, hvis der kan være null/empty-værdier i de kolonner, du sammenligner?

  2. Kan jeg automatisk generere Squeryl-dataobjekter for at afspejle et eksisterende MySql-skema?

  3. java.sql.SQLException:Ukendt indledende tegnsætindeks '255' modtaget fra serveren til connector 8.0.11

  4. Opret forbindelse til DB med PHP Class virker ikke, når du prøver at hente resultater