Skapa instanser av XML-data
gäller för:SQL Server
Azure SQL Database
Azure 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 medFOR 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å 0
bevaras 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 XML
finns 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. |