Generieren von XML-Instanzen

Wie unter XML-Datentyp beschrieben, können Sie XML-Instanzen in einer SQL Server-Datenbank speichern. In diesem Thema wird beschrieben, wie XML-Instanzen generiert werden.

In SQL Server gibt 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

Typumwandlung von Zeichenfolgen und Binärinstanzen

Sie können alle Zeichenfolgen-Datentypen von SQL Server, z. B. [n][var]char, [n]text, varbinary und image, im xml-Datentyp analysieren, indem Sie die Zeichenfolge in den xml-Datentyp 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 Typisiertes XML im Vergleich zu 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 eine UTF-16-Bytereihenfolgemarke (BOM, Byte Order Mark) besitzen, 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 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 Vorfeld nicht bekannt ist und die Daten vor der Konvertierung in XML als Zeichenfolgen- oder als Binärdaten übergeben werden, sollten die Daten als varbinary behandelt werden. 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 besitzt, können Instanzen dieses Typs explizit in einen XML-Datentyp umgewandelt werden. Weitere Einzelheiten zur XML-Serialisierung von benutzerdefinierten CLR-Typen finden Sie unter XML-Serialisierung auf Grundlage von CLR-Datenbankobjekten.

Leerzeichenbehandlung in typisiertem XML

In SQL Server werden Leerzeichen in Elementinhalten als unbedeutend betrachtet, 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 (Transact-SQL).

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

  • Das The 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 style-Parameter nicht verwendet oder sein 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 seines style-Parameters beim Konvertieren von Zeichenfolgendaten in xml DT-Instanzen finden Sie unter CAST und CONVERT (Transact-SQL).

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))

Sie können auch convert() wie im folgenden Beispiel gezeigt verwenden:

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. 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 Erstellen von XML mithilfe von FOR XML.

HinweisHinweis

Von 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>') 
HinweisHinweis

Für typisiertes XML wird das XML für das angegebene Schema überprüft. Weitere Informationen finden Sie unter Typisiertes XML im Vergleich zu nicht typisiertem XML.

Verwenden von Massenkopieren

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. Funktionstüchtige Vorlagen hierzu finden Sie unter Beispiele für den Massenimport und -export von XML-Dokumenten. Weitere Informationen über das Laden von XML-Dokumenten finden Sie unter Laden von XML-Daten.

In diesem Abschnitt

Thema

Beschreibung

Abrufen von XML-Daten

Beschreibt die Teile von XML-Instanzen, die nicht beibehalten werden, wenn sie in Datenbanken gespeichert werden.