XML-Datentyp

Der xml-Datentyp ermöglicht das Speichern von XML-Dokumenten und -Fragmenten in einer SQL Server-Datenbank. Ein XML-Fragment ist eine XML-Instanz, der ein einzelnes Element der obersten Ebene fehlt. Sie können Spalten und Variablen vom Typ xml erstellen und XML-Instanzen darin speichern. Beachten Sie, dass die gespeicherte Darstellung von xml-Datentypinstanzen 2 GB nicht überschreiten darf.

Optional können Sie einer Spalte, einem Parameter oder einer Variablen des xml-Datentyps eine XML-Schemaauflistung zuordnen. Die Schemas in der Auflistung werden verwendet, um XML-Instanzen zu überprüfen und zu typisieren. Letzteres wird als typisiertes XML bezeichnet.

Der xml-Datentyp und die zugehörigen Methoden sind bei der Integration von XML in das relationale Framework von SQL Server hilfreich. Weitere Informationen finden Sie unter xml-Datentypmethoden.

ms189887.note(de-de,SQL.90).gifHinweis:
Dieses Thema beschreibt nicht typisiertes XML. Informationen zu typisiertem XML finden Sie unter Typisiertes im Vergleich zu nicht typisiertem XML.

Erstellen von Variablen und Spalten des XML-Datentyps

Der xml-Datentyp ist ein integrierter Datentyp in SQL Server und ähnelt in gewisser Weise anderen integrierten Typen wie int und varchar. Wie andere integrierte Typen können Sie den xml-Datentyp beim Erstellen von Tabellen als Variablen-, Parameter- oder Funktionsrückgabespaltentyp oder in CAST und CONVERT verwenden. Dies wird in den folgenden Beispielen veranschaulicht.

Beispiel A

Erstellen einer Spalte vom Typ xml:

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

Beispiel B

Erstellen einer Variablen vom Typ xml:

DECLARE @x xml 

Erstellen einer typisierten xml-Variablen durch Angeben einer XML-Schemaauflistung:

declare @x xml (Sales.StoreSurveySchemaCollection)

Beispiel C

Übergeben eines Parameters vom Typ xml an eine gespeicherte Prozedur:

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

Zum Abfragen von den in Spalten, Variablen oder Parametern gespeicherten XML-Instanzen können Sie XQuery verwenden. Sie können auch die XML-Datenbearbeitungssprache (XML DML, Data Manipulation Language) verwenden, um Aktualisierungen an den XML-Instanzen vorzunehmen. Da der XQuery-Standard zum Zeitpunkt der Entwicklung keine Definition der XQuery-DML enthielt, führt SQL Server Erweiterungen der XML Data Modification Language (XML DML) für XQuery ein. Diese Erweiterungen ermöglichen Einfügungs-, Aktualisierungs- und Löschvorgänge.

Zuweisen von Standardeinstellungen

Sie können einer Spalte vom Typ xml in einer Tabelle eine standardmäßige XML-Instanz zuweisen. Es gibt zwei Möglichkeiten, um die Standard-XML-Instanz bereitzustellen, wie im Folgenden gezeigt.

Beispiel A

Bereitstellen der Standard-XML-Instanz als XML-Konstante (die Zeichenfolge wird mithilfe von CAST implizit in den xml-Typ umgewandelt):

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Beispiel B

Bereitstellen der Standard-XML-Instanz, indem Sie sie mithilfe von CAST explizit in xml umwandeln:

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server unterstützt auch NULL- und NOT NULL-Einschränkungen für Spalten vom Typ xml. Beispiel:

CREATE TABLE T (XmlColumn xml NOT NULL)

Angeben von Einschränkungen

Beim Erstellen von Spalten vom Typ xml können Sie auf Spalten- oder Tabellenebene Einschränkungen definieren. Die XML-Datentypmethoden können jedoch beim Angeben von Einschränkungen nicht verwendet werden. Als Alternative dazu können Sie einen benutzerdefinierten Wrapper für die Methode vom XML-Datentyp erstellen und die benutzerdefinierte Funktion in der Prüfeinschränkung angeben, wie im folgenden Beispiel gezeigt.

Im folgenden Beispiel gibt die Einschränkung für Col2 an, dass jede der in dieser Spalte gespeicherten XML-Instanzen ein <ProductDescription>-Element aufweisen muss, das ein ProductID-Attribut enthält. Diese Einschränkung wird durch folgende benutzerdefinierte Funktion erzwungen:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

Beachten Sie, dass die exist()-Methode des xml-Datentyps 1 zurückgibt, wenn das <ProductDescription>-Element der Instanz das ProductID-Attribut enthält. Andernfalls wird 0 zurückgegeben.

Jetzt können Sie eine Tabelle mit einer Einschränkung auf Spaltenebene erstellen, wie im Folgenden gezeigt:

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

Die folgende Einfügung wird erfolgreich ausgeführt:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

Aufgrund der Einschränkung erzeugt die folgende Einfügung einen Fehler:

INSERT INTO T values(1,'<Product />')

Ändern von Tabellen

Die ALTER TABLE-Anweisung unterstützt den xml-Datentyp. So können Sie z. B. eine beliebige Spalte vom Zeichenfolgentyp in den xml-Datentyp ändern. Beachten Sie, dass die in der Spalte enthaltenen Dokumente dazu wohlgeformt sein müssen. Außerdem werden beim Ändern des Spaltentyps vom Zeichenfolgentyp in den typisierten XML-Typ die Dokumente in der Spalte anhand der angegebenen XSD-Schemas überprüft.

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

Sie können eine nicht typisierte Spalte vom Typ xml in eine typisierte XML-Spalte ändern. Beispiel:

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
ms189887.note(de-de,SQL.90).gifHinweis:
Das Skript wird für die AdventureWorks-Datenbank ausgeführt, da die XML-Schemaauflistung Production.ProductDescriptionSchemaCollection als Teil der AdventureWorks-Datenbank erstellt wird.

Im vorherigen Beispiel werden alle in der Spalte gespeicherten Instanzen mit den XSD-Schemas der angegebenen Auflistung überprüft und typisiert. Wenn die Spalte eine oder mehrere in Bezug auf das angegebene Schema ungültige XML-Instanzen enthält, erzeugt die ALTER TABLE-Anweisung einen Fehler, d. h., Sie können die nicht typisierte XML-Spalte nicht in eine typisierte XML-Spalte ändern.

ms189887.note(de-de,SQL.90).gifHinweis:
Bei umfangreichen Tabellen kann das Ändern einer Spalte vom Typ xml äußerst aufwändig werden, da jedes Dokument auf Wohlgeformtheit überprüft und bei typisierten XML-Dokumenten auch eine Überprüfung durchgeführt werden muss.

Weitere Informationen zu typisiertem XML finden Sie unter Typisiertes im Vergleich zu nicht typisiertem XML.

Erstellen von Sichten

Sie können eine Spalte vom Typ xml zum Erstellen von Sichten verwenden. Im folgenden Beispiel wird eine Sicht erstellt, in der mithilfe der value()-Methode des xml-Datentyps der Wert aus einer Spalte vom Typ xml abgerufen wird.

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

Führen Sie die folgende Abfrage für die Sicht aus:

SELECT * 
FROM   MyView

Dies ist das Ergebnis:

ProductID   PName      
----------- ------------
1           SomeName 
ms189887.note(de-de,SQL.90).gifHinweis:
Der xml-Datentyp kann nicht in verteilten partitionierten Sichten verwendet werden.

Verwenden von XML in berechneten Spalten

XML-Instanzen können als Quelle für eine berechnete Spalte oder als Typ einer berechneten Spalte auftreten. So wird beispielsweise in der folgenden CREATE TABLE-Anweisung eine Spalte vom Typ xml (col2) aus col1 berechnet:

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

Der xml-Datentyp kann auch als Quelle für das Erstellen einer berechneten Spalte dienen, wie es in der folgenden CREATE TABLE-Anweisung gezeigt wird:

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

Sie können eine berechnete Spalte erstellen, indem Sie einen Wert aus einer Spalte vom Typ xml extrahieren, wie es im folgenden Beispiel gezeigt wird. Da die xml-Datentypmethoden nicht direkt zum Erstellen von berechneten Spalten verwendet werden können, wird in diesem Beispiel zunächst eine Funktion definiert (my_udf), die einen Wert aus einer XML-Instanz zurückgibt. Die Funktion dient als Wrapper für die value()-Methode des xml-Typs. Der Name der Funktion wird dann in der CREATE TABLE-Anweisung für die berechnete Spalte angegeben.

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

Wie im vorherigen Beispiel wird auch im folgenden Beispiel eine Funktion definiert, um für eine berechnete Spalte eine Instanz des xml-Typs zurückzugeben. Innerhalb der Funktion ruft die query()-Methode des xml-Datentyps einen Wert aus einem Parameter vom Typ xml ab.

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

In der folgenden CREATE TABLE-Anweisung ist Col2 eine berechnete Spalte, die die von der Funktion zurückgegebenen XML-Daten (das <Features>-Element) verwendet:

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

Siehe auch

Verweis

Verwenden von FOR XML und OPENXML zum Veröffentlichen und Verarbeiten von XML-Daten

Konzepte

Typisiertes im Vergleich zu nicht typisiertem XML
Generieren von XML-Instanzen
XML DML (Data Modification Language)
Indizes für Spalten vom xml-Datentyp
XML-Beispielanwendungen

Andere Ressourcen

xml-Datentypmethoden

Hilfe und Informationen

Informationsquellen für SQL Server 2005