Erstellen von XML-Datentypvariablen und -spalten

Anwendungsbereich:yesSQL Server (alle unterstützten Versionen) YesAzure SQL-Datenbank

Der xml -Datentyp ist ein integrierter Datentyp in SQL Server und ähnelt ein wenig anderen integrierten Typen wie int und varchar. Wie andere integrierte Typen können Sie den xml -Datentyp als Spaltentyp, wenn Sie eine Tabelle erstellen, als Variablentyp, als Parametertyp, als Funktionsrückgabestyp oder in CAST und CONVERTverwenden.

Erstellen von Spalten und Variablen

Verwenden Sie zur Erstellung einer Spalte des xml -Typs als Teil einer Tabelle eine CREATE TABLE -Anweisung, wie im folgenden Beispiel gezeigt:

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

Sie können eine DECLARE statement verwenden, um eine Variable des xml -Typs zu erstellen, wie das folgende Beispiel zeigt.

DECLARE @x xml;

Erstellen Sie eine typisierte xml -Variable, indem Sie eine XML-Schemaauflistung angeben, wie im folgenden Beispiel gezeigt.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

Verwenden Sie zum Übergeben eines Parameters des xml -Typs an eine gespeicherte Prozedur eine CREATE PROCEDURE -Anweisung, wie im folgenden Beispiel gezeigt.

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 Updates an den XML-Instanzen vorzunehmen. Da der XQuery-Standard XQuery DML zum Zeitpunkt der Entwicklung nicht definiert hat, führt SQL Server XML Data Modification Language-Erweiterungen in XQuery ein. Diese Erweiterungen ermöglichen Einfügungs-, Update- und Löschvorgänge.

Zuweisen von Standardeinstellungen

Sie können einer Spalte vom Typ xml in einer Tabelle eine standardmäßige XML-Instanz zuweisen. Sie können das Standard-XML auf zweierlei Weise bereitstellen: durch Verwenden einer XML-Konstante oder durch Verwenden einer expliziten Umwandlung in den xml -Typ.

Um das Standard-XML als XML-Konstante bereitzustellen, verwenden Sie die im folgenden Beispiel gezeigte Syntax. Die Zeichenfolge ist implizit cast to xml type.

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

Um das Standard-XML als explizites CAST in xmlbereitzustellen, verwenden Sie die im folgenden Beispiel gezeigte Syntax.

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. Verwenden Sie Einschränkungen in den folgenden Situationen:

  • Ihre Geschäftsregeln können nicht in XML-Schemas ausgedrückt werden. Beispielsweise muss sich die Lieferadresse eines Blumenladens in einem Umkreis von 50 Kilometern zum Ladenstandort befinden. Dies kann in Form einer Einschränkung für die XML-Spalte formuliert werden. Die Einschränkung kann xml -Datentypmethoden einbeziehen.

  • Ihre Einschränkung bezieht andere XML- oder Nicht-XML-Spalten in der Tabelle ein. Beispielsweise, wenn die Übereinstimmung der ID eines in einer XML-Instanz gefundenen Kunden (/Customer/@CustId) mit dem Wert in einer relationalen CustomerID-Spalte erzwungen werden soll.

Sie können Einschränkungen für typisierte oder nicht typisierte Spalten des xml -Datentyps eingegeben. Sie können jedoch die XML-Datentypmethoden nicht verwenden, wenn Sie Einschränkungen angeben.

Der XML-Datentyp unterstützt die folgenden Spalten- und Tabelleneinschränkungen nicht:

  • PRIMARY KEY/ FOREIGN KEY

  • UNIQUE

  • COLLATE

    XML stellt eine eigene Codierung bereit. Sortierungen gelten nur für Zeichenfolgentypen. Der XML-Datentyp ist kein Zeichenfolgentyp. Er besitzt jedoch die Zeichenfolgendarstellung und ermöglicht das Umwandeln in und aus Zeichenfolgen-Datentypen.

  • RULE

Eine Alternative zur Verwendung von Einschränkungen ist die Erstellung eines Wrappers, einer benutzerdefinierten Funktion, um die Methode des xml -Datentyps einzubinden und die benutzerdefinierte Funktion in der CHECK-Einschränkung anzugeben, wie im folgenden Beispiel zu sehen ist.

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

Die exist() Methode des XML-Datentyps gibt zurück 1 , wenn das <ProductDescription> Element in der Instanz das ProductID Attribut enthält. Andernfalls wird 0zurü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 />');

Gleiche oder unterschiedliche Tabelle

Eine xml -Datentypspalte kann entweder in einer Tabelle erstellt werden, die noch andere relationale Spalten enthält, oder in einer getrennten Tabelle mit einer Fremdschlüsselbeziehung zu einer Haupttabelle.

Erstellen Sie eine xml -Datentypspalte in derselben Tabelle, wenn eine der folgenden Bedingungen zutrifft:

  • Ihre Anwendung führt datenabrufe in der XML-Spalte aus und erfordert keinen XML-Index in der XML-Spalte.

  • Sie möchten einen XML-Index für die xml -Datentypspalte erstellen, und der Primärschlüssel der Haupttabelle ist derselbe wie ihr Gruppierungsschlüssel. Weitere Informationen finden Sie unter XML-Indizes (SQL Server).

Erstellen Sie die xml -Datentypspalte in einer getrennten Tabelle, wenn die folgenden Bedingungen zutreffen:

  • Sie möchten einen XML-Index in der XML-Datentypspalte erstellen, der Primärschlüssel der Haupttabelle unterscheidet sich jedoch von seinem Clusterschlüssel, oder die Haupttabelle verfügt nicht über einen Primärschlüssel, oder die Haupttabelle ist ein Heap (kein Clusterschlüssel). Das kann der Fall sein, wenn die Haupttabelle bereits vorhanden ist.

  • Tabellenscans sollen aufgrund der Anwesenheit der XML-Spalte in der Tabelle nicht verlangsamt werden. Dies beansprucht Speicherplatz, unabhängig davon, ob die Speicherung innerhalb oder außerhalb der Zeile erfolgt.