Erstellen von Instanzen von XML-Daten

Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL Datenbank

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

In SQL Servergibt es folgende Möglichkeiten, XML-Instanzen zu 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 alle Zeichenfolgen-Datentypen von SQL Server , z.B. [n][var]char, [n]text, varbinaryund image, im xml -Datentyp analysieren, indem Sie die Zeichenfolge in den xml -Datentyp umwandeln (CAST) oder konvertieren (CONVERT). Nicht typisierte XML wird überprüft, um zu bestätigen, dass es gut gebildet ist. Wenn dem XML-Typ ein Schema zugeordnet ist, wird auch die Ü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 über ein UTF-16-Bytereihenfolgezeichen (BOM) verfügen, muss aber nicht benötigt werden, da der Kontext des Quelltyps deutlich macht, dass es nur ein unicodecodiertes Unicode-Codiertes Dokument sein 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 als Zeichenfolge- oder Binärdaten anstelle von XML-Daten übergeben werden, bevor sie in XML umgewandelt werden, empfiehlt es sich, die Daten als varbinär zu behandeln. Wenn Sie z. B. Daten aus einer XML-Datei OpenRowset()mit lesen, sollte man die Daten angeben, die 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ärdarstellung dar, die UTF-16-Codierung verwendet. Die vom Benutzer bereitgestellte Codierung bleibt nicht erhalten, gilt aber während des Analysevorgangs.

Typ cast CLR-benutzerdefinierte Typen

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 Leerzeichen in eingegebenem XML

In SQL Server gilt leerer Leerraum innerhalb von Elementinhalten als unbedeutend, wenn sie in einer Sequenz von nur leerraumgeschützten Zeichendaten, die durch Markup getrennt sind, wie z. B. Anfangs- oder Endtags, und nicht entitisiert wird. (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. Die Ursache ist darin zu suchen, dass der XML-Parser in SQL Server nur eine beschränkte Anzahl der in XML 1.0 definierten DTD-Teilmengen erkennt. Weitere Informationen zu den begrenzten DTD-Untermengen, die in SQL Server unterstützt werden, finden Sie unter 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 Vorgängerelemente 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 entweder nicht verwendet wird oder der Wert auf 0 festgelegt ist, bleibt unbedeutender Leerraum für die Konvertierung der XML DT-Instanz nicht erhalten. Weitere Informationen zur Verwendung des CONVERT-Operators und des Formatvorlagenparameters beim Konvertieren von Zeichenfolgendaten in XML DT-Instanzen finden Sie unter CAST and CONVERT (Transact-SQL).

Beispiel: Cast a string value to typed XML and assign it to a column

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 auf den XML-Typ festlegencast():

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

Sie können auch wie in der folgenden Abbildung gezeigt folgendes verwenden convert():

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

Beispiel: Konvertieren einer Zeichenfolge in typiertes XML 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).

Hinweis

SQL Server werden xml -Datentypinstanzen an den Client zurückgegeben, die das Ergebnis unterschiedlicher Serverkonstrukte sind (z. B. FOR XML-Abfragen, für die die TYPE-Direktive verwendet wird, oder bei denen 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.

Massenlade 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. Beispiele für Arbeitsbeispiele finden Sie unter Beispiele für massenweises Importieren und Exportieren von XML-Dokumenten (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.

Weitere Informationen