次の方法で共有


XMLスキーマコレクションの作成(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

データベースにスキーマ コンポーネントをインポートします。

Transact-SQL 構文表記規則

構文

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

引数

relational_schema

リレーショナル スキーマ名を指定します。 指定しない場合、既定のリレーショナル スキーマが使用されます。

sql_identifier

XML スキーマ コレクションの SQL 識別子。

[式]

文字列定数またはスカラー変数。 varcharvarbinarynvarchar、または xml 型です。

注釈

ALTER XML SCHEMA COLLECTION を使用して、新しい名前空間をコレクションに追加したり、コレクションの既存の名前空間に新しいコンポーネントを追加したりすることもできます。

コレクションを削除するには、 DROP XML SCHEMA COLLECTION を使用します

アクセス許可

XML SCHEMA COLLECTION を作成するには、少なくとも次のいずれかの権限セットが必要です。

  • CONTROL サーバーに対するアクセス許可
  • ALTER ANY DATABASE サーバーに対するアクセス許可
  • ALTER データベースに対するアクセス許可
  • CONTROL データベースのアクセス許可
  • ALTER ANY SCHEMA データベースのアクセス許可と CREATE XML SCHEMA COLLECTION 権限
  • ALTERまたは、リレーショナル スキーマに対するアクセス許可とデータベース内のCONTROLアクセス許可をCREATE XML SCHEMA COLLECTIONする

A. データベースに XML スキーマ コレクションを作成する

次の例では、XML スキーマ コレクション ManuInstructionsSchemaCollection を作成します。 コレクションにはスキーマ名前空間が 1 つだけ含まれます。

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

または、次のようにスキーマ コレクションを変数に割り当て、その変数を CREATE XML SCHEMA COLLECTION ステートメントで指定することもできます。

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

この例の変数は nvarchar(max) 型です。 変数は xml データ型でもかまいません。その場合、暗黙的に文字列に変換されます。

詳細については、「 保存されている XML スキーマ コレクションを表示する」を参照してください。

スキーマ コレクションは xml 型の列に格納できます。 この場合、XML スキーマ コレクションを作成するには、次の手順に従います。

  1. SELECT ステートメントを使用して列からスキーマ コレクションを取得し、xml 型の変数または varchar 型に割り当てます。

  2. CREATE XML SCHEMA COLLECTION ステートメントで変数名を指定します。

CREATE XML SCHEMA COLLECTIONには、SQL Server が認識するスキーマ コンポーネントのみが格納されます。XML スキーマ内のすべてがデータベースに格納されることはありません。 そのため、XML スキーマ コレクションを指定したとおりに戻す場合は、XML スキーマをデータベース列またはコンピューター上の他のフォルダーに保存する必要があります。

B. スキーマ コレクションに複数のスキーマ名前空間を指定する

XML スキーマ コレクションを作成するときには、複数の XML スキーマを指定できます。 次に例を示します。

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

次の例では、2 つの XML スキーマ名前空間を含む XML スキーマ コレクション ProductDescriptionSchemaCollection を作成します。

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. ターゲット名前空間を指定しないスキーマをインポートする

targetNamespace属性を含まないスキーマがコレクションにインポートされる場合、そのコンポーネントは、次の例に示すように空の文字列ターゲット名前空間に関連付けられます。 コレクションにインポートされた 1 つ以上のスキーマを関連付けなかった場合、複数のスキーマ コンポーネント (関連しない可能性があります) が既定の空の文字列名前空間に関連付けられます。

-- 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 スキーマ コレクションとバッチを使用する

スキーマ コレクションは、作成されたのと同じバッチ内で参照できません。 作成されたのと同じバッチ内のコレクションを参照しようとすると、コレクションが存在しないというエラーが表示されます。 次の例は機能します。ただし、 GO を削除し、したがって、XML スキーマ コレクションを参照して同じバッチ内に XML 変数を入力しようとすると、エラーが返されます。

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