ALTER XML SCHEMA COLLECTION (Transact-SQL)

Fügt einer vorhandenen XML-Schemaauflistung neue Schemakomponenten hinzu.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

ALTER XML SCHEMA COLLECTION [ relational_schema. ]sql_identifier ADD 'Schema Component'

Argumente

  • relational_schema
    Identifiziert den Namen des relationalen Schemas. Wenn kein Name angegeben ist, wird das relationale Standardschema verwendet.

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

  • 'Schema Component'
    Die einzufügende Schemakomponente.

Hinweise

Verwenden Sie ALTER XML SCHEMA COLLECTION zum Einfügen neuer XML-Schemas, deren Namespaces noch nicht in der XML-Schemaauflistung vorhanden sind, oder zum Hinzufügen neuer Komponenten zu vorhandenen Namespaces in der Auflistung.

Im folgenden Beispiel wird dem vorhandenen http://MySchema/test_xml_schema-Namespace in der MyColl-Auflistung ein neues <element> hinzugefügt.

-- First create an XML schema collection.
CREATE XML SCHEMA COLLECTION MyColl AS '
   <schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://MySchema/test_xml_schema">
      <element name="root" type="string"/> 
  </schema>'
-- Modify the collection. 
ALTER XML SCHEMA COLLECTION MyColl ADD '
  <schema xmlns="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://MySchema/test_xml_schema"> 
     <element name="anotherElement" type="byte"/> 
 </schema>'

ALTER XML SCHEMA fügt das Element <anotherElement> dem zuvor definierten http://MySchema/test_xml_schema-Namespace hinzu.

Falls einige der Komponenten, die Sie in den Auflistungsverweiskomponenten hinzufügen möchten, bereits in derselben Auflistung vorhanden sind, müssen Sie <import namespace="referenced_component_namespace" /> verwenden. Es ist jedoch nicht zulässig, den aktuellen Schemanamespace in <xsd:import> zu verwenden. Deshalb werden Komponenten aus demselben Zielnamespace wie der aktuelle Schemanamespace automatisch importiert.

Verwenden Sie DROP XML SCHEMA COLLECTION (Transact-SQL), um Auflistungen zu entfernen.

Wenn die Schemaauflistung bereits ein Platzhalterzeichen für die lax-Überprüfung oder ein Element vom Typ xs:anyType enthält, wird beim Hinzufügen eines neuen globalen Elements oder Typs bzw. einer Attributdeklaration zu der Schemaauflistung eine erneute Überprüfung aller gespeicherten Daten ausgeführt, die durch die Schemaauflistung beschränkt werden.

Berechtigungen

Zum Ändern von XML SCHEMA COLLECTION ist die ALTER-Berechtigung für die Auflistung erforderlich.

Weitere Informationen finden Sie unter Berechtigungen für eine XML-Schemaauflistung.

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 the collection name 
-- that is specified.
DECLARE @x 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 nvarchar(max)
Set @MySchemaCollection  = N' copy the schema collection here'
CREATE XML SCHEMA COLLECTION AS @MySchemaCollection 

Die Variable im Beispiel ist vom Datentyp nvarchar(max). Möglich ist auch der Datentyp xml. In diesem Fall wird die Variable implizit in eine Zeichenfolge konvertiert.

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

Schemaauflistungen können in einer Spalte vom Datentyp xml gespeichert werden. Führen Sie in diesem Fall die folgenden Schritte aus, um eine XML-Schemaauflistung zu erstellen:

  1. Rufen Sie die Schemaauflistung mithilfe einer SELECT-Anweisung aus der Spalte ab, und weisen Sie sie einer Variablen vom Datentyp xml oder varchar zu.

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

Die CREATE XML SCHEMA COLLECTION-Anweisung speichert nur die Schemakomponenten, die SQL Server interpretieren kann. Nicht alles im XML-Schema wird in der Datenbank gespeichert. Wenn Sie den ursprünglichen Zustand der XML-Schemaauflistung wiederherstellen möchten, sollten Sie daher Ihre XML-Schemas in einer Datenbankspalte oder in einem anderen Ordner auf dem 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 N'
<xsd:schema>....</xsd:schema>
<xsd:schema>...</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="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription" 
    elementFormDefault="qualified" 
    xmlns:mstns="http://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

Falls ein Schema, das kein targetNamespace-Attribut enthält, in eine Auflistung importiert wird, werden dessen Komponenten wie im folgenden Beispiel dem Zielnamespace mit einer leeren Zeichenfolge zugeordnet. Wenn nicht mindestens ein importiertes Schema in der Auflistung zugeordnet wird, werden mehrere Schemakomponenten (möglicherweise nicht verknüpfte Komponenten) dem standardmäßigen Namespace mit einer leeren Zeichenfolge zugeordnet.

-- 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 
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=''