Aracılığıyla paylaş


XML ŞEMA KOLEKSIYONU OLUŞTUR (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Şema bileşenlerini veritabanına aktarır.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Arguments

relational_schema

İlişkisel şema adını tanımlar. Belirtilmezse, varsayılan ilişkisel şema varsayılır.

sql_identifier

XML şema koleksiyonu için SQL tanımlayıcısı.

İfade

Dize sabiti veya skaler değişken. Varchar, varbinary, nvarchar veya xml türüdür.

Açıklamalar

Ayrıca ALTER XML SCHEMA COLLECTION kullanarak koleksiyona yeni ad alanları ekleyebilir veya koleksiyondaki mevcut ad alanlarına yeni bileşenler ekleyebilirsiniz.

Koleksiyonları kaldırmak için DROP XML SCHEMA COLLECTION kullanın.

Permissions

XML SCHEMA COLLECTION oluşturmak için aşağıdaki izin kümelerinden en az biri gerekir:

  • CONTROL sunucuda izin
  • ALTER ANY DATABASE sunucuda izin
  • ALTER veritabanında izin
  • CONTROL veritabanında izin
  • ALTER ANY SCHEMA veritabanında izin ve CREATE XML SCHEMA COLLECTION izin
  • ALTER veya CONTROL veritabanındaki ilişkisel şema ve CREATE XML SCHEMA COLLECTION izin üzerinde izin

Örnekler

A. Veritabanında XML şema koleksiyonu oluşturma

Aşağıdaki örnek XML şema koleksiyonunu ManuInstructionsSchemaCollectionoluşturur. Koleksiyonun yalnızca bir şema ad alanı vardır.

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

Alternatif olarak, şema koleksiyonunu bir değişkene atayabilir ve deyiminde değişkenini CREATE XML SCHEMA COLLECTION aşağıdaki gibi belirtebilirsiniz:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

Örnekteki değişken türündedir nvarchar(max) . Değişken xml veri türünde de olabilir ve bu durumda örtük olarak bir dizeye dönüştürülür.

Daha fazla bilgi için bkz. Depolanan XML şema koleksiyonunu görüntüleme.

Şema koleksiyonlarını bir xml türü sütununda depolayabilirsiniz. Bu durumda, XML şema koleksiyonu oluşturmak için aşağıdaki adımları gerçekleştirin:

  1. Deyimini kullanarak SELECT sütundan şema koleksiyonunu alın ve xml türünde veya varchar türünde bir değişkene atayın .

  2. Deyiminde CREATE XML SCHEMA COLLECTION değişken adını belirtin.

Yalnızca CREATE XML SCHEMA COLLECTION SQL Server'ın anladığı şema bileşenlerini depolar; XML şemasındaki her şey veritabanında depolanmaz. Bu nedenle, XML şema koleksiyonunu tam olarak sağlandığı gibi geri almak istiyorsanız, XML şemalarınızı bir veritabanı sütununa veya bilgisayarınızdaki başka bir klasöre kaydetmeniz gerekir.

B. Şema koleksiyonunda birden çok şema ad alanı belirtme

BIR XML şema koleksiyonu oluştururken birden çok XML şeması belirtebilirsiniz. Örneğin:

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

Aşağıdaki örnek, iki XML şeması ad alanı içeren XML şema koleksiyonunu ProductDescriptionSchemaCollection oluşturur.

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. Hedef ad alanı belirtmeyen bir şemayı içeri aktarma

Öznitelik içermeyen bir targetNamespace şema bir koleksiyona aktarılırsa, bileşenleri aşağıdaki örnekte gösterildiği gibi boş dize hedef ad alanıyla ilişkilendirilir. Koleksiyonda içeri aktarılan bir veya daha fazla şemanın ilişkilendirilmemesi, birden çok şema bileşeninin (potansiyel olarak ilişkisiz) varsayılan boş dize ad alanıyla ilişkilendirilmesine neden olur.

-- 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. XML şema koleksiyonu ve toplu işleri kullanma

Şema koleksiyonuna, oluşturulduğu toplu işte başvurulamıyor. Oluşturulduğu toplu işteki bir koleksiyona başvurmaya çalışırsanız, koleksiyonun var olmadığını belirten bir hata alırsınız. Aşağıdaki örnek çalışır; ancak, ve öğesini kaldırırsanız GO ve bu nedenle xml şeması koleksiyonuna başvurarak aynı toplu işe bir XML değişkeni yazmayı denerseniz, hata döndürür.

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