Bagikan melalui


MEMBUAT KOLEKSI SKEMA XML (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Mengimpor komponen skema ke dalam database.

Konvensi sintaks transact-SQL

Sintaks

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

Argumen

relational_schema

Mengidentifikasi nama skema relasional. Jika tidak ditentukan, skema relasional default diasumsikan.

sql_identifier

Pengidentifikasi SQL untuk koleksi skema XML.

Expression

Konstanta string atau variabel skalar. Adalah jenis varchar, varbinary, nvarchar, atau xml .

Keterangan

Anda juga dapat menambahkan namespace baru ke koleksi atau menambahkan komponen baru ke namespace yang sudah ada dalam koleksi dengan menggunakan ALTER XML SCHEMA COLLECTION.

Untuk menghapus koleksi, gunakan DROP XML SCHEMA COLLECTION.

Izin

Untuk membuat KOLEKSI SKEMA XML memerlukan setidaknya salah satu dari sekumpulan izin berikut:

  • CONTROL izin pada server
  • ALTER ANY DATABASE izin pada server
  • ALTER izin pada database
  • CONTROL izin dalam database
  • ALTER ANY SCHEMA izin dan CREATE XML SCHEMA COLLECTION izin dalam database
  • ALTER atau CONTROL izin pada skema relasional dan CREATE XML SCHEMA COLLECTION izin dalam database

Contoh

J. Membuat kumpulan skema XML dalam database

Contoh berikut membuat koleksi ManuInstructionsSchemaCollectionskema XML . Koleksi hanya memiliki satu namespace skema.

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

Atau, Anda dapat menetapkan koleksi skema ke variabel dan menentukan variabel dalam CREATE XML SCHEMA COLLECTION pernyataan sebagai berikut:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

Variabel dalam contoh berjenis nvarchar(max) . Variabel juga dapat berupa jenis data xml , dalam hal ini, secara implisit dikonversi menjadi string.

Untuk informasi selengkapnya, lihat Menampilkan kumpulan skema XML yang disimpan.

Anda mungkin menyimpan koleksi skema di kolom jenis xml . Dalam hal ini, untuk membuat koleksi skema XML, lakukan langkah-langkah berikut:

  1. Ambil koleksi skema dari kolom dengan menggunakan SELECT pernyataan dan tetapkan ke variabel jenis xml , atau jenis varchar .

  2. Tentukan nama variabel dalam CREATE XML SCHEMA COLLECTION pernyataan.

Hanya CREATE XML SCHEMA COLLECTION menyimpan komponen skema yang dipahami SQL Server; semua yang ada dalam skema XML tidak disimpan dalam database. Oleh karena itu, jika Anda ingin koleksi skema XML kembali persis seperti yang disediakan, Anda harus menyimpan skema XML Anda di kolom database, atau beberapa folder lain di komputer Anda.

B. Tentukan beberapa namespace skema dalam kumpulan skema

Anda dapat menentukan beberapa skema XML saat membuat koleksi skema XML. Contohnya:

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

Contoh berikut membuat kumpulan ProductDescriptionSchemaCollection skema XML yang menyertakan dua namespace skema XML.

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. Mengimpor skema yang tidak menentukan namespace target

Jika skema yang tidak berisi targetNamespace atribut diimpor dalam koleksi, komponennya dikaitkan dengan namespace target string kosong seperti yang ditunjukkan dalam contoh berikut. Tidak mengaitkan satu atau beberapa skema yang diimpor dalam koleksi menyebabkan beberapa komponen skema (berpotensi tidak terkait) dikaitkan dengan namespace string kosong default.

-- 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. Menggunakan kumpulan dan batch skema XML

Kumpulan skema tidak dapat direferensikan dalam batch yang sama tempat kumpulan dibuat. Jika Anda mencoba mereferensikan koleksi dalam batch yang sama tempatnya dibuat, Anda mendapatkan kesalahan yang mengatakan koleksi tidak ada. Contoh berikut berfungsi; namun, jika Anda menghapus GO dan, oleh karena itu, cobalah untuk mereferensikan koleksi skema XML untuk mengetik variabel XML dalam batch yang sama, itu mengembalikan kesalahan.

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