CREATE XML SCHEMA COLLECTION (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

将架构组件导入数据库中。

Transact-SQL 语法约定

语法

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

参数

relational_schema

标识关系架构的名称。 如果不指定,则假定为默认关系架构。

sql_identifier

XML 架构集合的 SQL 标识符。

表达式

字符串常量或标量变量。 为 varchar、varbinary、nvarchar 或 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 权限
  • ALTERCONTROL 对数据库中的关系架构和 CREATE XML SCHEMA COLLECTION 权限的权限

示例

A. 在数据库中创建 XML 架构集合

下面的示例将创建 XML 架构集合 ManuInstructionsSchemaCollection。 该集合只有一个架构命名空间。

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

下面的示例将创建包含两个 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 属性的架构,则其组件与空字符串目标命名空间相关联,如以下示例所示。 不关联集合中导入的一个或多个架构会导致多个架构组件(可能不相关)与默认的空字符串命名空间相关联。

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