Freigeben über


ERSTELLEN SIE EINE XML-SCHEMA-SAMMLUNG (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Importiert die Schemakomponenten in eine Datenbank.

Transact-SQL-Syntaxkonventionen

Syntax

CREATE XML SCHEMA COLLECTION [ <relational_schema>. ] sql_identifier AS Expression

Argumente

relational_schema

Identifiziert den Namen des relationalen Schemas. Wird kein Wert angegeben, wird vom relationalen Standardschema ausgegangen.

sql_identifier

Der SQL-Bezeichner für die XML-Schemaauflistung.

Ausdruck

Eine Zeichenfolgenkonstante oder skalare Variable. Ist vom Typ Varchar, Varbinary, Nvarchar oder xml.

Bemerkungen

Mithilfe von ALTER XML SCHEMA COLLECTION können Sie der Collection auch neue Namespaces bzw. vorhandenen Namespaces in der Auflistung auch neue Komponenten hinzufügen.

Um Sammlungen zu entfernen, verwenden Sie DROP XML SCHEMA COLLECTION.

Berechtigungen

Zum Erstellen von XML SCHEMA COLLECTION ist zumindest eine der folgenden Berechtigungsgruppen erforderlich:

  • CONTROL Berechtigung auf dem Server
  • ALTER ANY DATABASE Berechtigung auf dem Server
  • ALTER Berechtigung für die Datenbank
  • CONTROL Berechtigung in der Datenbank
  • ALTER ANY SCHEMA Berechtigung und CREATE XML SCHEMA COLLECTION Berechtigung in der Datenbank
  • ALTER oder CONTROL Berechtigung für das relationale Schema und CREATE XML SCHEMA COLLECTION die Berechtigung in der Datenbank

Beispiele

A. Erstellen einer XML-Schemaauflistung in der Datenbank

Im folgenden Beispiel wird die XML-Schemaauflistung ManuInstructionsSchemaCollection erstellt. Diese Auflistung hat nur einen Schemanamespace.

-- Create a sample database in which to load the XML schema collection.
CREATE DATABASE SampleDB;
GO

USE SampleDB;
GO

CREATE XML SCHEMA COLLECTION ManuInstructionsSchemaCollection
    AS N'<?xml version="1.0" encoding="UTF-16"?>
<xsd:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   xmlns          ="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

    <xsd:complexType name="StepType" mixed="true" >
        <xsd:choice  minOccurs="0" maxOccurs="unbounded" >
            <xsd:element name="tool" type="xsd:string" />
            <xsd:element name="material" type="xsd:string" />
            <xsd:element name="blueprint" type="xsd:string" />
            <xsd:element name="specs" type="xsd:string" />
            <xsd:element name="diag" type="xsd:string" />
        </xsd:choice>
    </xsd:complexType>

    <xsd:element  name="root">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element name="Location" minOccurs="1" maxOccurs="unbounded">
                    <xsd:complexType mixed="true">
                        <xsd:sequence>
                            <xsd:element name="step" type="StepType" minOccurs="1" maxOccurs="unbounded" />
                        </xsd:sequence>
                        <xsd:attribute name="LocationID" type="xsd:integer" use="required"/>
                        <xsd:attribute name="SetupHours" type="xsd:decimal" use="optional"/>
                        <xsd:attribute name="MachineHours" type="xsd:decimal" use="optional"/>
                        <xsd:attribute name="LaborHours" type="xsd:decimal" use="optional"/>
                        <xsd:attribute name="LotSize" type="xsd:decimal" use="optional"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>';
GO

-- Verify - list of collections in the database.
SELECT *
FROM sys.xml_schema_collections;

-- Verify - list of namespaces in the database.
SELECT name
FROM sys.xml_schema_namespaces;

-- Use it. Create a typed xml variable. Note collection name specified.
DECLARE @x AS XML(ManuInstructionsSchemaCollection);
GO

--Or create a typed xml column.
CREATE TABLE T
(
    i INT PRIMARY KEY,
    x XML(ManuInstructionsSchemaCollection)
);
GO

-- Clean up
DROP TABLE T;
GO

DROP XML SCHEMA COLLECTION ManuInstructionsSchemaCollection;
GO

USE master;
GO

DROP DATABASE SampleDB;

Alternativ können Sie die Schemaauflistung einer Variablen zuweisen und die Variable in der CREATE XML SCHEMA COLLECTION-Anweisung wie folgt angeben:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

SET @MySchemaCollection = N' copy the schema collection here';

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

Die Variable im Beispiel ist vom Datentyp nvarchar(max). Die Variable kann auch vom XML-Datentyp sein, in diesem Fall wird sie implizit in eine Zeichenfolge konvertiert.

Weitere Informationen finden Sie unter Anzeigen einer gespeicherten XML-Schemaauflistung.

Sie können Schemasammlungen in einer XML-Typspalte speichern. Führen Sie in diesem Fall zum Erstellen einer XML-Schemaauflistung die folgenden Schritte aus:

  1. Rufen Sie die Schemaauflistung aus der Spalte mithilfe einer SELECT Anweisung ab, und weisen Sie sie einer Variablen vom XML-Typ oder einem Varchar-Typ zu.

  2. Geben Sie den Variablennamen in der CREATE XML SCHEMA COLLECTION Anweisung an.

Es CREATE XML SCHEMA COLLECTION werden nur die Schemakomponenten gespeichert, die SQL Server versteht. Alles im XML-Schema wird nicht in der Datenbank gespeichert. Wenn Die XML-Schemaauflistung daher genau die Art und Weise wie sie bereitgestellt werden soll, sollten Sie ihre XML-Schemas in einer Datenbankspalte oder in einem anderen Ordner auf Ihrem Computer speichern.

B. Angeben mehrerer Schemanamespaces in einer Schemaauflistung

Sie können mehrere XML-Schemas angeben, wenn Sie eine XML-Schemaauflistung erstellen. Beispiel:

CREATE XML SCHEMA COLLECTION MyCollection
    AS N'
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Contents of schema here -->
</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Contents of schema here -->
</xsd:schema>';

Im folgenden Beispiel wird die XML-Schemaauflistung ProductDescriptionSchemaCollection erstellt, die zwei XML-Schemanamespaces enthält.

CREATE XML SCHEMA COLLECTION ProductDescriptionSchemaCollection
    AS '<xsd:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"
    xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"
    elementFormDefault="qualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
    <xsd:element name="Warranty"  >
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="WarrantyPeriod" type="xsd:string"  />
                <xsd:element name="Description" type="xsd:string"  />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
 <xs:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
    xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
    elementFormDefault="qualified"
    xmlns:mstns="https://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain" >
    <xs:import
namespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain" />
    <xs:element name="ProductDescription" type="ProductDescription" />
        <xs:complexType name="ProductDescription">
            <xs:sequence>
                <xs:element name="Summary" type="Summary" minOccurs="0" />
            </xs:sequence>
            <xs:attribute name="ProductModelID" type="xs:string" />
            <xs:attribute name="ProductModelName" type="xs:string" />
        </xs:complexType>
        <xs:complexType name="Summary" mixed="true" >
            <xs:sequence>
                <xs:any processContents="skip" namespace="http://www.w3.org/1999/xhtml" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
</xs:schema>';
GO

-- Clean up
DROP XML SCHEMA COLLECTION ProductDescriptionSchemaCollection;
GO

C. Importieren eines Schemas, das keinen Zielnamespace angibt

Wenn ein Schema, das kein Attribut enthält targetNamespace , in eine Auflistung importiert wird, werden die zugehörigen Komponenten dem leeren Zeichenfolgenzielnamespace zugeordnet, wie im folgenden Beispiel gezeigt. Wenn Sie ein oder mehrere in die Auflistung importierte Schemas nicht zuordnen, werden mehrere Schemakomponenten (potenziell nicht verknüpft) mit dem standardmäßigen leeren Zeichenfolgennamespace verknüpft.

-- Create a collection that contains a schema with no target namespace.
CREATE XML SCHEMA COLLECTION MySampleCollection
    AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema"  xmlns:ns="http://ns">
<element name="e" type="dateTime"/>
</schema>';
GO

-- Query will return the names of all the collections that
--contain a schema with no target namespace.
SELECT sys.xml_schema_collections.name
FROM sys.xml_schema_collections
     INNER JOIN sys.xml_schema_namespaces
         ON sys.xml_schema_collections.xml_collection_id = sys.xml_schema_namespaces.xml_collection_id
WHERE sys.xml_schema_namespaces.name = '';

D: Verwenden einer XML-Schemaauflistung und -batches

Auf eine Schemaauflistung kann nicht im selben Batch verwiesen werden, auf den sie erstellt wird. Wenn Sie versuchen, auf eine Sammlung im selben Batch zu verweisen, in dem sie erstellt wurde, wird eine Fehlermeldung angezeigt, die besagt, dass die Sammlung nicht vorhanden ist. Das folgende Beispiel funktioniert; Wenn Sie jedoch entfernen GO und daher versuchen, auf die XML-Schemaauflistung zu verweisen, um eine XML-Variable im selben Batch einzugeben, wird ein Fehler zurückgegeben.

CREATE XML SCHEMA COLLECTION mySC
    AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
      <element name="root" type="string"/>
</schema>
';
GO

CREATE TABLE T
(
    Col1 XML(mySC)
);
GO