Erstellen von Instanzen von XML-Daten

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

In diesem Artikel wird beschrieben, wie XML-Instanzen generiert werden.

In SQL Server können Sie XML-Instanzen auf folgende Weise generieren:

  • Typumwandlung von Zeichenfolgeninstanzen

  • Verwenden der SELECT-Anweisung mit der FOR XML-Klausel

  • Verwenden von Konstantenzuweisungen

  • Verwenden von Massenladen

Typ cast string and binary instances

Sie können jeden der SQL Server-Zeichenfolgendatentypen analysieren, z. B. [n][var]char, [n]text, varbinary und image, in den XML-Datentyp, indem Sie die Zeichenfolge umwandeln (CAST) oder die Zeichenfolge (CONVERT) in den XML-Datentyp konvertieren. Nicht typisierte XML-Daten werden überprüft, um zu bestätigen, dass sie wohlgeformt ist. Wenn dem XML-Typ ein Schema zugeordnet ist, wird auch eine Überprüfung ausgeführt. Weitere Informationen finden Sie unter Vergleichen von typisiertem XML mit nicht typisiertem XML.

XML-Dokumente können unterschiedlich codiert werden (z. B.: UTF-8, UTF-16, Windows-1252). Im Folgenden werden die Regeln erläutert, nach denen Zeichenfolgen- und Binärtypen mit der Codierung des XML-Dokuments interagieren und die das Verhalten des Parsers steuern.

Da nvarchar eine Doppelbyte-Unicode-Codierung wie UTF-16 oder UCS-2 annimmt, behandelt der XML-Parser den Zeichenfolgenwert als Doppelbyte-Unicode-codiertes XML-Dokument oder -Fragment. Dies bedeutet, dass auch das XML-Dokument in Doppelbyte-Unicode codiert sein muss, um mit dem Quelldatentyp kompatibel zu sein. Ein UTF-16-codiertes XML-Dokument kann ein UTF-16-Bytereihenfolgezeichen (BOM) aufweisen, aber es ist nicht erforderlich, da der Kontext des Quelltyps deutlich macht, dass es sich nur um ein unicode-codiertes Unicode-Dokument handeln kann.

Der Inhalt einer varchar -Zeichenfolge wird vom XML-Parser als Einzelbyte-XML-Dokument/-Fragment behandelt. Da der Quellzeichenfolge varchar eine Codepage zugeordnet ist, verwendet der Parser diese Codepage für die Codierung, wenn im XML-Code keine explizite Codierung angegeben ist. Wenn eine XML-Instanz eine BOM- oder eine Codierungsdeklaration besitzt, muss diese zur Codepage passen. Andernfalls gibt der Parser einen Fehler aus.

Der Inhalt von varbinary wird als Codepointdatenstrom behandelt, der direkt an den XML-Parser übergeben wird. Daher muss das XML-Dokument oder -Fragment die BOM- oder eine andere Codierungsangabe inline enthalten. Der Parser bestimmt die Codierung ausschließlich anhand des Datenstroms. Dies bedeutet, dass UTF-16-codiertes XML die UTF-16-BOM enthalten muss, und dass eine Instanz ohne BOM und ohne Deklaration als UTF-8 interpretiert wird.

Wenn die Codierung des XML-Dokuments im Voraus nicht bekannt ist und die Daten vor dem Umwandeln in XML als Zeichenfolgen- oder Binärdaten übergeben werden, empfiehlt es sich, die Daten als Varbinary zu behandeln. Wenn Sie z. B. Daten aus einer XML-Datei OpenRowset()lesen, sollte eine angeben, welche Daten als varbinary(max) -Wert gelesen werden sollen:

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

SQL Server stellt XML intern in einer effizienten binären Darstellung dar, die UTF-16-Codierung verwendet. Die vom Benutzer bereitgestellte Codierung wird nicht beibehalten, wird jedoch während des Analysevorgangs berücksichtigt.

Typ cast CLR user-defined types

Wenn ein benutzerdefinierter CLR-Typ eine XML-Serialisierung besitzt, können Instanzen dieses Typs explizit in einen XML-Datentyp umgewandelt werden. Weitere Informationen zur XML-Serialisierung eines benutzerdefinierten CLR-Typs finden Sie unter XML-Serialisierung aus CLR-Datenbankobjekten.

Behandeln von Leerraum in eingegebenem XML

In SQL Server gilt leerer Leerraum innerhalb von Elementinhalten als unbedeutend, wenn sie innerhalb einer Sequenz von nur leerzeichengeschützten Zeichendaten, die durch Markup getrennt sind, wie z. B. Anfang- oder Endtags, auftreten und nicht entitisiert werden. (CDATA-Abschnitte werden ignoriert). Diese Behandlung von Leerzeichen unterscheidet sich von der Beschreibung von Leerzeichen in der XML 1.0-Spezifikation, die vom W3C (World Wide Web Consortium) veröffentlicht wird. Dies liegt daran, dass der XML-Parser in SQL Server nur eine begrenzte Anzahl von DTD-Teilmengen erkennt, wie in XML 1.0 definiert. Weitere Informationen zu den begrenzten DTD-Teilmengen, die in SQL Server unterstützt werden, finden Sie unter CAST und CONVERT (Transact-SQL).For more information about the limited DTD subsets supported in SQL Server, see CAST and CONVERT (Transact-SQL).

Standardmäßig verwirft der XML-Parser insignifikante Leerzeichen, wenn Zeichenfolgendaten in XML konvertiert werden, wenn eine der folgenden Bedingungen zutrifft:

  • Das xml:space Attribut ist nicht für ein Element oder seine übergeordneten Elemente definiert.

  • Das xml:space -Attribut für ein Element oder eines seiner Vorgängerelemente weist den Standardwert auf.

Beispiel:

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

Dies ist das Ergebnis:

<root><child/></root>

Sie können dieses Verhalten jedoch ändern. Um Leerzeichen für eine xml DT-Instanz beizubehalten, verwenden Sie den CONVERT-Operator und seinen optionalen style -Parameter, um einen Wert von 1 festzulegen. Beispiel:

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

Wenn der Formatvorlagenparameter nicht verwendet wird oder der Wert auf 0 festgelegt ist, wird für die Konvertierung der XML DT-Instanz kein unbedeutender Leerraum beibehalten. Weitere Informationen zur Verwendung des CONVERT-Operators und des Formatparameters beim Konvertieren von Zeichenfolgendaten in XML DT-Instanzen finden Sie unter CAST und CONVERT (Transact-SQL).For more information about how to use the CONVERT operator and its style parameter when convert string data to xml DT instances, see CAST and CONVERT (Transact-SQL).

Beispiel: Umwandeln eines Zeichenfolgenwerts in eingegebene XML-Daten und Zuweisen eines Zeichenfolgenwerts zu einer Spalte

Das folgende Beispiel wandelt eine Zeichenfolgenvariable, die ein XML-Fragment enthält, in den xml -Datentyp um und speichert diesen dann in der Spalte vom Typ xml :

CREATE TABLE T(c1 int primary key, c2 xml);
GO
DECLARE  @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

Der folgende insert-Vorgang wandelt eine Zeichenfolge implizit in den xml -Typ um:

INSERT INTO T VALUES (3, @s);

Sie können die Zeichenfolge explizit für den XML-Typ verwendencast():

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

Oder Sie können , wie in den folgenden Beispielen dargestellt, verwenden convert():

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

Beispiel: Konvertieren einer Zeichenfolge in eingegebene XML-Daten und Zuweisen einer Variablen

Im folgenden Beispiel wird eine Zeichenfolge in den xml -Typ konvertiert und dann einer Variablen des xml -Datentyps zugewiesen.

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

Verwenden der SELECT-Anweisung mit einer FOR XML-Klausel

Sie können die FOR XML-Klausel in einer SELECT-Anweisung verwenden, um Ergebnisse als XML zurückzugeben. Beispiel:

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

Die SELECT-Anweisung gibt ein XML-Textfragment zurück, das dann während der Zuweisung zur Variablen des xml -Datentyps analysiert wird.

Sie können auch die TYPE-Direktive in der FOR XML-Klausel verwenden, die direkt ein FOR XML-Abfrageergebnis als xml -Datentyp zurückgibt:

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

Dies ist das Ergebnis:

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

Im folgenden Beispiel wird das typisierte xml -Ergebnis einer FOR XML-Abfrage in eine Spalte vom Typ xml eingefügt:

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

Weitere Informationen zu FOR XML finden Sie unter FOR XML (SQL Server).For more information about FOR XML, see FOR XML (SQL Server).

Hinweis

SQL Server gibt xml-Datentypinstanzen als Ergebnis verschiedener Serverkonstrukte an den Client zurück, z. B. FOR XML-Abfragen, die die TYPE-Direktive verwenden, oder wenn der XML-Datentyp verwendet wird, um XML aus SQL-Spalten, Variablen und Ausgabeparametern zurückzugeben. Im Clientanwendungscode wird vom ADO.NET-Anbieter angefordert, dass diese xml -Datentypinformationen als Binärcode vom Server gesendet werden. Wenn Sie FOR XML jedoch ohne die TYPE-Direktive verwenden, werden die XML-Daten als Zeichenfolgentyp zurückgegeben. Der Clientanbieter ist in jedem Fall fähig, beide XML-Formate zu verarbeiten.

Verwenden von Konstantenzuweisungen

Eine Zeichenfolgenkonstante kann dort verwendet werden, wo eine Instanz des xml -Datentyps erwartet wird. Dies entspricht einer impliziten CAST-Anweisung für die Zeichenfolge in XML. Beispiel:

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/>';

Im vorherigen Beispiel wurde die Zeichenfolge implizit in den xml -Datentyp konvertiert und dann einer Variablen des xml -Datentyps zugewiesen.

Das folgende Beispiel fügt eine Konstantenzeichenfolge in eine Spalte vom Typ xml ein:

CREATE TABLE T(c1 INT PRIMARY KEY, c2 XML);
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Hinweis

Für typisiertes XML wird das XML für das angegebene Schema überprüft. Weitere Informationen finden Sie unter Vergleichen von typisiertem XML mit nicht typisiertem XML.

Massenlast verwenden

Die verbesserten OPENROWSET (Transact-SQL) -Funktionen ermöglichen das Massenkopieren von XML-Dokumenten in der Datenbank. Sie können XML-Instanzen aus Dateien in Spalten vom Typ xml in der Datenbank mit einem Massenkopiervorgang kopieren. Arbeitsbeispiele finden Sie unter Beispiele für massenweises Importieren und Exportieren von XML-Dokumenten (SQL Server).For working samples, see Examples of Bulk Import and Export of XML Documents (SQL Server). Weitere Informationen über das Laden von XML-Dokumenten finden Sie unter Laden von XML-Daten.

In diesem Abschnitt

Artikel Beschreibung
Abrufen und Abfragen von XML-Daten Beschreibt die Teile von XML-Instanzen, die nicht beibehalten werden, wenn sie in Datenbanken gespeichert sind.

Siehe auch