Dela via


Skapa instanser av XML-data

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

I den här artikeln beskrivs hur du genererar XML-instanser.

I SQL Server kan du generera XML-instanser på följande sätt:

  • Typomvandling av stränginstanser.
  • Använda SELECT-instruktionen med FOR XML-satsen.
  • Använda konstanta tilldelningar.
  • Använda massinläsning.

Skriv cast-sträng och binära instanser

Du kan parsa någon av SQL Server-strängdatatyperna, till exempel [n]varchar, [n]char, [n]text, varbinaryoch bild, i datatypen xml genom att konvertera (CAST) eller konvertera (CONVERT) strängen till xml- datatyp. Otypad XML kontrolleras för att bekräfta att den är välformulerad. Om det finns ett schema som är associerat med XML- typ utförs även validering. Mer information finns i Jämför inskriven XML med otypad XML-.

XML-dokument kan kodas med olika kodningar (till exempel UTF-8, UTF-16, Windows-1252). Följande beskriver reglerna för hur sträng- och binära källtyper interagerar med XML-dokumentkodningen och hur parsern beter sig.

Eftersom nvarchar förutsätter en Unicode-kodning på 2 byte, till exempel UTF-16 eller UCS-2, behandlar XML-parsern strängvärdet som ett Unicode-kodat XML-dokument eller fragment med 2 byte. XML-dokumentet måste kodas i en Unicode-kodning på 2 byte och vara kompatibelt med källdatatypen. Ett UTF-16-kodat XML-dokument kan ha en UTF-16 byte order mark (BOM), men det behöver det inte, eftersom kontexten för källtypen gör det tydligt att det bara kan vara ett 2-byte Unicode-kodat dokument.

Innehållet i en sträng behandlas som ett 1 byte kodat XML-dokument/fragment av XML-parsern. Eftersom -varchar--källsträngen har en associerad kodsida använder parsern kodsidan för kodningen om ingen explicit kodning anges i själva XML-koden. Om en XML-instans har en strukturlista eller en kodningsdeklaration måste strukturlistan eller deklarationen vara konsekvent med kodsidan, annars rapporterar parsern ett fel.

Innehållet i varbinära behandlas som en kodpunktsström som skickas direkt till XML-parsern. XML-dokumentet eller -fragmentet måste därför tillhandahålla BOM eller annan kodningsinformation direkt i dokumentet. Parsern tittar bara på strömmen för att fastställa kodningen. Det innebär att UTF-16-kodad XML måste tillhandahålla UTF-16-BOM, och en instans utan BOM och utan en deklarerad kodning tolkas som UTF-8.

Om kodningen av XML-dokumentet inte är känd i förväg och data skickas som sträng- eller binärdata i stället för XML-data innan de konverteras till XML, bör du behandla data som varbinära. När du till exempel läser data från en XML-fil med OpenRowset()bör man ange vilka data som ska läsas som ett varbinary(max) värde:

SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server representerar internt XML i en effektiv binär representation som använder UTF-16-kodning. Kodning som tillhandahålls av användaren bevaras inte, men beaktas under parsningsprocessen.

Typkonvertera CLR-användardefinierade typer

Om en CLR-användardefinierad typ har en XML-serialisering kan instanser av den typen uttryckligen omvandlas till en XML-datatyp. Mer information om XML-serialiseringen av en CLR-användardefinierad typ finns i XML-serialisering från CLR Database Objects.

Hantera tomt utrymme i skriven XML

I SQL Server ignoreras tomt utrymme inuti elementinnehåll om det inträffar i en sekvens med teckendata med endast tomt utrymme avgränsade med markering, till exempel start- eller sluttaggar, och inte är berättigat. (CDATA avsnitt ignoreras.) Den här hanteringen av blanksteg skiljer sig från hur blanksteg beskrivs i XML 1.0-specifikationen som publicerats av World Wide Web Consortium (W3C). Det beror på att XML-parsern i SQL Server endast känner igen ett begränsat antal DTD-underuppsättningar, enligt definitionen i XML 1.0. Mer information om de begränsade DTD-delmängder som stöds i SQL Server finns i CAST och CONVERT.

Som standard tar XML-parsaren bort obetydligt tomt utrymme när strängdata konverteras till XML om något av följande alternativ är sant:

  • Attributet xml:space definieras inte för ett element eller dess överordnade element.

  • Detta xml:space-attribut som gäller för ett element, eller ett av dess överordnade element, har standardvärdet.

Till exempel:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

Här är resultatet.

<root><child/></root>

Du kan dock ändra det här beteendet. Om du vill bevara tomt utrymme för en XML DT-instans använder du operatorn CONVERT och dess valfria formatmall parameter inställd på värdet 1. Till exempel:

SELECT CONVERT(XML, N'<root>      <child/>     </root>', 1);

Om parametern formatmall inte används eller om värdet är inställt på 0bevaras inte obetydligt tomt utrymme för konverteringen av XML DT-instansen. Mer information om hur du använder operatorn CONVERT och dess format parameter när du konverterar strängdata till XML DT-instanser finns i CAST- och CONVERT-.

Exempel: Omvandla ett strängvärde till skrivet XML och tilldela det till en kolumn

I följande exempel omvandlas en strängvariabel som innehåller ett XML-fragment till xml- datatyp och lagrar den sedan i kolumnen xml typ:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);
GO

DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

Följande infogningsåtgärd konverterar implicit från en sträng till xml- typ:

INSERT INTO T
VALUES (3, @s);

Du kan uttryckligen CAST strängen till xml- typ:

INSERT INTO T
VALUES (3, CAST(@s AS XML));

Du kan också använda CONVERT, som du ser i följande kodexempel:

INSERT INTO T
VALUES (3, CONVERT(XML, @s));

Exempel: Konvertera en sträng till skriven XML och tilldela den till en variabel

I följande exempel konverteras en sträng till xml- typ och tilldelas till en variabel av xml- datatyp:

DECLARE @x XML;
DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);

SELECT @x;

Använd SELECT-instruktionen med en FOR XML-sats

Du kan använda FOR XML-satsen i en SELECT-instruktion för att returnera resultat som XML. Till exempel:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT Column1, Column2
        FROM Table1, Table2
        WHERE <some_condition>
        FOR XML AUTO
)
...;

Instruktionen SELECT returnerar ett text-XML-fragment som sedan parsas under tilldelningen till variabeln xml- datatyp.

Du kan också använda TYPE-direktivet i FOR XML-frågor i FOR XML-satsen som direkt returnerar FOR XML frågeresultat som xml- typ.

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT @xmlDoc;

Här är resultatet.

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

I följande exempel infogas det inskrivna xml- resultatet av en FOR XML fråga i en xml- typkolumn:

CREATE TABLE T1 (
    c1 INT,
    c2 XML
);
GO

INSERT T1 (c1, c2)
SELECT 1, (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT *
FROM T1;
GO

Mer information om FOR XMLfinns i FÖR XML (SQL Server).

Not

SQL Server returnerar XML- datatypsinstanser till klienten som ett resultat av olika serverkonstruktioner, till exempel FOR XML frågor som använder TYPE-direktivet, eller där xml- datatyp används för att returnera XML från SQL Server Database Engine-kolumner, variabler och utdataparametrar. I klientprogramkoden begär ADO.NET-providern att den här xml- datatypsinformation skickas i en binär kodning från servern. Men om du använder FOR XML utan TYPE-direktivet returneras XML-data som en strängtyp. I vilket fall som helst kommer klientprovidern alltid att kunna hantera båda formerna av XML.

Använda konstanta tilldelningar

En strängkonstant kan användas där en instans av XML- datatyp förväntas. Den här uppgiften är likvärdig med en underförstådd CAST från sträng till XML. Till exempel:

DECLARE @xmlDoc XML;

SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

I föregående exempel konverteras strängen implicit till xml- datatyp och tilldelar den till en xml- typvariabel.

I följande exempel infogas en konstant sträng i en xml- typkolumn:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);

INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Not

För skriven XML verifieras XML:en mot det angivna schemat. Mer information finns i Jämför inskriven XML med otypad XML-.

Använda storladdning

Med den förbättrade funktionen OPENROWSET kan du massinläsa XML-dokument i databasen. Du kan massladda XML-instanser från filer till XML--typkolumner i databasen. Arbetsexempel finns i Exempel på massimport och export av XML-dokument (SQL Server). Mer information om hur du läser in XML-dokument finns i Läsa in XML-data.

I det här avsnittet

Artikel Beskrivning
XML-frågealternativ och bevarade data Beskriver de delar av XML-instanser som inte bevaras när de lagras i databaser.