Delen via


XML-SCHEMAVERZAMELING MAKEN (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Hiermee importeert u de schemaonderdelen in een database.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

relational_schema

Hiermee wordt de naam van het relationele schema geïdentificeerd. Als dit niet is opgegeven, wordt ervan uitgegaan dat het standaard relationele schema wordt gebruikt.

sql_identifier

De SQL-id voor de XML-schemaverzameling.

Uitdrukking

Een tekenreeksconstante of scalaire variabele. Is varchar, varbinary, nvarchar of xml-type .

Opmerkingen

U kunt ook nieuwe naamruimten toevoegen aan de verzameling of nieuwe onderdelen toevoegen aan bestaande naamruimten in de verzameling met behulp van ALTER XML SCHEMA COLLECTION.

Als u verzamelingen wilt verwijderen, gebruikt u DROP XML SCHEMA COLLECTION.

Permissions

Voor het maken van een XML-SCHEMAVERZAMELING zijn ten minste een van de volgende sets machtigingen vereist:

  • CONTROL machtiging op de server
  • ALTER ANY DATABASE machtiging op de server
  • ALTER machtiging voor de database
  • CONTROL machtiging in de database
  • ALTER ANY SCHEMA machtiging en CREATE XML SCHEMA COLLECTION machtiging in de database
  • ALTER of CONTROL machtiging voor het relationele schema en CREATE XML SCHEMA COLLECTION de machtiging in de database

Voorbeelden

Eén. XML-schemaverzameling maken in de database

In het volgende voorbeeld wordt de XML-schemaverzameling ManuInstructionsSchemaCollectiongemaakt. De verzameling heeft slechts één schemanaamruimte.

-- 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;

U kunt de schemaverzameling ook als volgt toewijzen aan een variabele en de variabele in de CREATE XML SCHEMA COLLECTION instructie als volgt opgeven:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

De variabele in het voorbeeld is van nvarchar(max) het type. De variabele kan ook van het xml-gegevenstype zijn. In dat geval wordt deze impliciet geconverteerd naar een tekenreeks.

Zie Een opgeslagen XML-schemaverzameling weergeven voor meer informatie.

U kunt schemaverzamelingen opslaan in een xml-typekolom . Voer in dit geval de volgende stappen uit om een XML-schemaverzameling te maken:

  1. Haal de schemaverzameling op uit de kolom met behulp van een SELECT instructie en wijs deze toe aan een variabele van het XML-type of een varchar-type .

  2. Geef de naam van de variabele op in de CREATE XML SCHEMA COLLECTION instructie.

Hiermee CREATE XML SCHEMA COLLECTION worden alleen de schemaonderdelen opgeslagen die SQL Server begrijpt. Alles in het XML-schema wordt niet opgeslagen in de database. Als u de XML-schemaverzameling daarom precies wilt terugzetten zoals deze is opgegeven, moet u uw XML-schema's opslaan in een databasekolom of een andere map op uw computer.

B. Meerdere schemanaamruimten opgeven in een schemaverzameling

U kunt meerdere XML-schema's opgeven wanneer u een XML-schemaverzameling maakt. Voorbeeld:

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

In het volgende voorbeeld wordt de XML-schemaverzameling ProductDescriptionSchemaCollection gemaakt die twee XML-schemanaamruimten bevat.

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. Een schema importeren dat geen doelnaamruimte opgeeft

Als een schema dat geen kenmerk bevat targetNamespace , wordt geïmporteerd in een verzameling, worden de bijbehorende onderdelen gekoppeld aan de lege doelnaamruimte van de tekenreeks, zoals wordt weergegeven in het volgende voorbeeld. Als u een of meer schema's die in de verzameling zijn geïmporteerd niet koppelt, worden meerdere schemaonderdelen (mogelijk niet-gerelateerd) gekoppeld aan de standaard lege tekenreeksnaamruimte.

-- 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. Een XML-schemaverzameling en -batches gebruiken

Er kan niet naar een schemaverzameling worden verwezen in dezelfde batch waarin deze wordt gemaakt. Als u probeert te verwijzen naar een verzameling in dezelfde batch waarin deze is gemaakt, krijgt u een foutmelding dat de verzameling niet bestaat. Het volgende voorbeeld werkt; Als u echter verwijdert GO en daarom probeert te verwijzen naar de XML-schemaverzameling om een XML-variabele in dezelfde batch te typen, wordt er een fout geretourneerd.

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