Vergleichen von typisiertem XML-Code mit nicht typisiertem XML

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Sie können Variablen, Parameter und Spalten des xml -Datentyps erstellen. Optional können Sie eine Auflistung von XML-Schemas mit einer Variablen, einem Parameter oder einer Spalte vom Typ xml verknüpfen. In diesem Fall wird die Instanz des xml -Datentyps als typisiertbezeichnet. Anderenfalls wird die XML-Instanz als nicht typisiertbezeichnet.

Wohlgeformte XML und der XML-Datentyp

Der xml -Datentyp implementiert den im ISO-Standard definierten xml -Datentyp. Deshalb ermöglicht er das Speichern sowohl von wohlgeformten XML-Dokumenten der Version 1.0 als auch von so genannten XML-Inhaltsfragmenten mit Textknoten und einer beliebigen Anzahl von Elementen auf der obersten Ebene in einer nicht typisierten XML-Spalte. Das System überprüft, ob die Daten wohlgeformt sind, erfordert nicht, dass die Spalte an XML-Schemas gebunden ist, und lehnt Daten ab, die im erweiterten Sinne nicht wohlgeformt sind. Dies gilt auch für nicht typisierte XML-Variablen und -Parameter.

XML-Schemas

Ein XML-Schema stellt Folgendes bereit:

  • Überprüfungseinschränkungen. Bei jeder Zuweisung oder Änderung einer typisierten xml-Instanz überprüft SQL Server die Instanz.

  • Datentypinformationen. Schemas stellen Informationen zu den Typen von Attributen und Elementen in der xml -Datentypinstanz bereit. Die Typinformationen stellen den in der Instanz enthaltenen Werten genauere operationale Semantik zur Verfügung als dies bei untypisiertem xmlmöglich ist. Dezimale arithmetische Operationen können z. B. für einen Dezimalwert, nicht jedoch für einen Zeichenfolgenwert ausgeführt werden. Aus diesem Grund ist die Speicherung typisierten XMLs erheblich kompakter als bei nicht typisiertem XML.

Auswählen von typisiertem oder nicht typisiertem XML

Verwenden Sie den nicht typisierten xml -Datentyp in den folgenden Situationen:

  • Sie verfügen nicht über ein Schema für Ihre XML-Daten.

  • Sie verfügen über Schemas, möchten aber nicht, dass der Server die Daten überprüft. Dies ist manchmal der Fall, wenn eine Anwendung eine clientseitige Überprüfung vor dem Speichern der Daten auf dem Server durchführt oder vorübergehend XML-Daten speichert, die gemäß dem Schema ungültig sind, oder Schemakomponenten verwendet, die auf dem Server nicht unterstützt werden.

Verwenden Sie den typisierten xml -Datentyp in den folgenden Situationen:

  • Sie verfügen über Schemas für Ihre XML-Daten und wollen, dass der Server anhand der XML-Schemas die Gültigkeit Ihrer XML-Daten überprüft.

  • Sie möchten Speicherungs- und Abfrageoptimierungen nutzen, die auf den Typinformationen basieren.

  • Sie möchten beim Kompilieren Ihrer Abfragen einen größeren Nutzen aus den Typinformationen ziehen.

Typisierte XML-Spalten, -Parameter und -Variablen können XML-Dokumente oder -Inhalte speichern. Sie müssen jedoch mit einem Kennzeichen angeben, ob Sie ein Dokument oder einen Inhalt zum Zeitpunkt der Deklaration speichern. Außerdem müssen Sie die Auflistung der XML-Schemas bereitstellen. Geben Sie DOCUMENT an, wenn jede XML-Instanz genau ein Element auf der obersten Ebene aufweist. Verwenden Sie ansonsten CONTENT. Der Abfragecompiler verwendet das DOCUMENT-Flag bei den Typüberprüfungen während der Abfragekompilierung, um Singleton-Elemente auf der obersten Ebene abzuleiten.

Erstellen von typiertem XML

Bevor Sie typierte XML-Variablen , Parameter oder Spalten erstellen können, müssen Sie zuerst die XML-Schemaauflistung mithilfe von CREATE XML SCHEMA COLLECTION (Transact-SQL) registrieren. Anschließend können Sie der XML-Schemaauflistung Variablen, Parameter oder Spalten des xml -Datentyps zuordnen.

Im folgenden Beispiel wird eine zweiteilige Benennungskonvention zum Angeben des Namens der XML-Schemaauflistung verwendet. Der erste Teil ist der Schemaname, der zweite Teil der Name der XML-Schemaauflistung.

Beispiel: Zuordnen einer Schemaauflistung zu einer XML-Typvariable

Im folgenden Beispiel wird eine Variable vom Typ xml erstellt und eine Schemaauflistung mit dieser verknüpft. Die im Beispiel angegebene Schemaauflistung wurde bereits in die AdventureWorks -Datenbank importiert.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection);

Beispiel: Angeben eines Schemas für eine XML-Typspalte

Im folgenden Beispiel wird eine Tabelle mit einer Spalte vom Typ xml erstellt und ein Schema für die Spalte angegeben:

CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));

Beispiel: Übergeben eines XML-Typparameters an eine gespeicherte Prozedur

Im folgenden Beispiel wird ein Parameter vom Typ xml an eine gespeicherte Prozedur übergeben und ein Schema für die Variable angegeben:

CREATE PROCEDURE SampleProc
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...

Beachten Sie hinsichtlich der XML-Schemaauflistung Folgendes:

  • Eine XML-Schemaauflistung ist nur in der Datenbank verfügbar, in der sie mit Erstellen einer XML-Schemaauflistungregistriert wurde.

  • Wenn Sie die Umwandlung aus einer Zeichenfolge in einen typisierten xml -Datentyp vornehmen, führt die Analyse außerdem die Überprüfung und Typisierung basierend auf den XML-Schemanamespaces in der angegebenen Auflistung aus.

  • Sie können einen typisierten xml -Datentyp in einen nicht typisierten xml -Datentyp umwandeln und umgekehrt.

Weitere Informationen zu anderen Methoden zum Generieren von XML in SQL Server finden Sie unter Erstellen von Instanzen der XML-Daten. Nachdem das XML generiert wurde, kann es einer Variablen vom Datentyp xml zugewiesen oder in Spalten vom Typ xml für die weitere Verarbeitung gespeichert werden.

In der Datentyphierarchie nimmt der xml -Datentyp einen Platz unter sql_variant und benutzerdefinierten Typen ein, steht jedoch über allen integrierten Typen.

Beispiel: Angeben von Facets zum Einschränken einer typierten XML-Spalte

Typisierte xml -Spalten können so eingeschränkt werden, dass nur einzelne Elemente der obersten Ebene für jede darin gespeicherte Instanz zulässig sind. Sie geben zu diesem Zweck beim Erstellen der Tabelle den optionalen DOCUMENT -Facet an, wie das folgende Beispiel zeigt:

CREATE TABLE T(Col1 xml
   (DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO

Standardmäßig werden Instanzen, die in der typisierten xml -Spalte gespeichert werden, als XML-Inhalt und nicht als XML-Dokumente gespeichert. Folgendes wird auf diese Weise ermöglicht:

  • Null oder zahlreiche Elemente der obersten Ebene

  • Textknoten in Elementen der obersten Ebene

Sie können dieses Verhalten auch explizit festlegen, indem Sie, wie im folgenden Beispiel dargestellt, das CONTENT -Facet hinzufügen:

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default

Sie können die optionalen DOCUMENT/CONTENT-Facets an einer beliebigen Stelle angeben, an der Sie xml-Typ (typisiert xml) definieren. Wenn Sie eine typisierte xml -Variable erstellen, können Sie z.B. das DOCUMENT/CONTENT-Facet, wie im folgenden Beispiel gezeigt, hinzufügen:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);

Dokumenttypdefinition (DTD)

Die Spalten, Variablen und Parameter des xml -Datentyps können mithilfe eines XML-Schemas typisiert werden, jedoch nicht mithilfe von DTD. Allerdings kann Inline-DTD sowohl für nicht typisiertes als auch für typisiertes XML verwendet werden, um Standardwerte bereitzustellen und um Entitätsverweise durch ihre erweiterte Form zu ersetzen.

Mithilfe von Drittanbieter-Tools können Sie DTDs in XML-Schemadokumente konvertieren und die XML-Schemas in die Datenbank laden.

Aktualisieren von typiertem XML von SQL Server 2005

SQL Server 2008 (10.0.x) hat mehrere Erweiterungen an der XML-Schemaunterstützung vorgenommen, einschließlich Unterstützung für die Lax-Validierung, verbesserte Handhabung von xs:date,xs:time- und xs:dateTime-Instanzdaten sowie Unterstützung für Listen- und Union-Typen hinzugefügt. In den meisten Fällen wirken sich die Änderungen nicht auf die Upgradeerfahrung aus. Wenn Sie jedoch eine XML-Schemaauflistung in SQL Server 2005 (9.x) verwendet haben, die Werte vom Typ "xs:date", "xs:time" oder "xs:dateTime " (oder "beliebiger Untertyp") zulässig hat, treten die folgenden Upgradeschritte auf, wenn Sie Die SQL Server 2005(9.x)-Datenbank an eine höhere Version von SQL Server anfügen:

  1. Für jede XML-Spalte, die mit einer XML-Schemaauflistung typisiert ist, die Elemente oder Attribute vom Typ xs:anyType, xs:anySimpleType, xs:date oder eines Untertyps davon, xs:time oder eines Untertyps davon oder xs:dateTime oder eines Untertyps davon enthält bzw. Elemente oder Attribute vom Typ union oder list sind, die einen dieser Typen enthalten, wird folgender Vorgang ausgeführt:

    1. Alle XML-Indizes der Spalte werden deaktiviert.

    2. Alle SQL Server 2005 (9.x)-Werte werden weiterhin in der Z-Zeitzone dargestellt, da sie in die Z-Zeitzone normalisiert wurden.

    3. Alle xs:date- oder xs:dateTime-Werte, die kleiner als der 1. Januar des Jahres 1 sind, führen zu einem Laufzeitfehler, wenn der Index neu erstellt wird oder eine XQuery- oder XML-DML-Anweisung für den XML-Datentyp ausgeführt wird, der diesen Wert enthält.

  2. Alle negativen Jahre in xs:date oder xs:dateTime Facets oder Standardwerten in einer XML-Schemaauflistung werden automatisch auf den kleinsten Wert aktualisiert, der vom Basistyp "xs:date" oder "xs:dateTime" zulässig ist (z. B. 001-01-01T00:00:00.000000Z für xs:dateTime).

Sie können weiterhin eine Transact-SQL SELECT-Anweisung verwenden, um den gesamten XML-Datentyp abzurufen, auch wenn er negative Jahre enthält. Es wird empfohlen, negative Jahre durch ein Jahr innerhalb des neu unterstützten Bereichs zu ersetzen oder den Typ des Elements oder Attributs in "xs:string" zu ändern.

Siehe auch