Erstellen von Instanzen der XML-Daten
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
In diesem Artikel wird beschrieben, wie XML-Instanzen generiert werden.
In SQL Server gibt es folgende Möglichkeiten, XML-Instanzen zu generieren:
- Typumwandlung von Zeichenfolgeninstanzen
- Mithilfe der
SELECT
-Anweisung mit derFOR XML
-Klausel - Verwenden von Konstantenzuweisungen
- Verwenden von Massenladen
Typumwandlung von Zeichenfolgen und Binärinstanzen
Sie können SQL Server-String-Datentypen, wie z. B [n]varchar, [n]char, [n]text, varbinary und image im Datentyp xml analysieren, indem Sie die jeweilige Zeichenfolge in den Datentyp xml umwandeln (CAST
) oder konvertieren (CONVERT
). Nicht typisiertes XML wird überprüft, um die Wohlgeformtheit zu bestätigen. Wenn dem xml-Datentyp ein Schema zugeordnet ist, wird ebenfalls 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. Das XML-Dokument muss ebenfalls in Doppelbyte-Unicode codiert sein, um mit dem Quelldatentyp kompatibel zu sein. Ein UTF-16-codiertes XML-Dokument kann eine UTF-16-Bytereihenfolge-Marke (BOM, Byte Order Mark) aufweisen, benötigt diese aber nicht, da der Kontext des Quelltyps deutlich macht, dass es sich nur um ein Doppelbyte-Unicode-Dokument handeln kann.
Der Inhalt einer varchar-Zeichenfolge wird vom XML-Parser als Einzelbyte-XML-Dokument/-Fragment behandelt. Da der Varchar-Quellzeichenfolge eine Codeseite zugeordnet ist, verwendet der Parser diese Codeseite für die Codierung, wenn im XML selbst keine explizite Codierung angegeben ist. Wenn eine XML-Instanz eine BOM oder eine Codierungsdeklaration aufweist, muss die BOM oder Deklaration mit der Codeseite konsistent sein, andernfalls meldet der Parser einen Fehler.
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. Das bedeutet, dass UTF-16-codiertes XML die UTF-16-BOM enthalten muss und eine Instanz ohne BOM und ohne Deklarationscodierung als UTF-8 interpretiert wird.
Wenn die Codierung des XML-Dokuments nicht im Voraus bekannt ist und die Daten vor dem Umwandeln in XML als Zeichenfolgen- oder Binärdaten statt als XML-Daten übergeben werden, sollten Sie die Daten als varbinary behandeln. Wenn z. B. Daten aus einer XML-Datei mit OpenRowset()
gelesen werden, sollten die zu lesenden Daten als varbinary(max)-Wert festgelegt sein:
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. Vom Benutzer bereitgestellte Codierung wird nicht beibehalten, während des Analysevorgangs jedoch berücksichtigt.
Typumwandlung benutzerdefinierter CLR-Typen
Wenn ein benutzerdefinierter CLR-Typ eine XML-Serialisierung aufweist, 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 auf Grundlage von CLR-Datenbankobjekten.
Behandlung von Leerzeichen in typisiertem XML
In SQL Server werden Leerzeichen in Elementinhalten ignoriert, wenn diese in einer Sequenz von Nur-Leerzeichen-Zeichendaten auftreten, die durch ein Markup wie z. B. Begin- oder End-Tags getrennt und nicht in Entitäten geändert 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. 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 beschränkten DTD-Teilmengen, die in SQL Server unterstützt werden, finden Sie unter CAST und CONVERT.
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.
Zum Beispiel:
DECLARE @x XML;
SET @x = '<root> <child/> </root>';
SELECT @x;
Hier sehen Sie 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 den optionalen style-Parameter, der auf den Wert 1 festgelegt ist. Zum Beispiel:
SELECT CONVERT(XML, N'<root> <child/> </root>', 1);
Wenn der style-Parameter nicht verwendet oder der Wert auf 0
festgelegt wird, werden insignifikante Leerzeichen für die Konvertierung der XML-DT-Instanz nicht beibehalten. Weitere Informationen zum Verwenden des CONVERT
-Operators und des style-Parameters beim Konvertieren von Zeichenfolgendaten in XML-DT-Instanzen finden Sie unter CAST und CONVERT.
Beispiel: Umwandeln eines Zeichenfolgenwertes in typisiertes XML und Zuweisen des Wertes 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);
Mithilfe von CAST
können Sie die Zeichenfolge explizit in den xml-Datentyp umwandeln:
INSERT INTO T
VALUES (3, CAST(@s AS XML));
Alternativ können Sie CONVERT
verwenden, wie im folgenden Codebeispiel dargestellt:
INSERT INTO T
VALUES (3, CONVERT(XML, @s));
Beispiel: Konvertieren einer Zeichenfolge in typisiertes XML und Zuweisen der Zeichenfolge zu einer Spalte
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. Zum 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 bei der Zuweisung zur Variablen des xml-Datentyps analysiert wird.
Sie können auch die TYPE-Anweisung in FOR XML-Abfragen 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;
Hier sehen Sie 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
In SQL Server werden Instanzen des xml-Datentyps an den Client zurückgegeben, die das Ergebnis unterschiedlicher Serverkonstrukte sind (z. B. FOR XML
-Abfragen, für die die TYPE
-Anweisung verwendet wird, oder bei denen mit dem xml-Datentyp XML aus Spalten, Variablen und Ausgabeparametern der SQL Server-Datenbank-Engine zurückgegeben wird). 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
-Anweisung 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. Diese Zuweisung entspricht einer impliziten CAST
-Anweisung für die Zeichenfolge in XML. Zum 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.
Verwenden des Massenladens
Die verbesserte OPENROWSET-Funktionalität ermöglicht 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. Funktionierende Beispiele finden Sie unter Beispiele für den Massenimport und -export 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 |
---|---|
XML-Abfrageoptionen und beibehaltene Daten | Beschreibt die Teile von XML-Instanzen, die nicht beibehalten werden, wenn sie in Datenbanken gespeichert werden. |