Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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. Otyperad XML kontrolleras för att bekräfta att det är välformat. 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:spacedefinieras 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).
Anmärkning
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>');
Anmärkning
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. |