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.
Hinweis: |
---|
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
Hinweis: |
---|
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.
Hinweis: |
---|
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
Hinweis: |
---|
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