Compartilhar via


CRIAR COLEÇÃO DE ESQUEMAS XML (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de dados SQL no Microsoft Fabric

Importa os componentes do esquema para um banco de dados.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

relational_schema

Identifica o nome de esquema relacional. Se não for especificado, o esquema relacional padrão será considerado.

sql_identifier

O identificador SQL da coleção de esquemas XML.

Expression

Uma constante de cadeia de caracteres ou variável escalar. É do tipo varchar, varbinary, nvarchar ou xml.

Comentários

Também é possível adicionar novos namespaces à coleção ou adicionar novos componentes a namespaces existentes usando ALTER XML SCHEMA COLLECTION.

Para remover coleções, use DROP XML SCHEMA COLLECTION.

Permissões

A criação de XML SCHEMA COLLECTION requer pelo menos um dos seguintes conjuntos de permissões:

  • CONTROL permissão no servidor
  • ALTER ANY DATABASE permissão no servidor
  • ALTER permissão no banco de dados
  • CONTROL permissão no banco de dados
  • ALTER ANY SCHEMA permissão e CREATE XML SCHEMA COLLECTION permissão no banco de dados
  • ALTER ou CONTROL permissão no esquema relacional e CREATE XML SCHEMA COLLECTION permissão no banco de dados

Exemplos

a. Criar coleção de esquemas XML no banco de dados

O exemplo a seguir cria uma coleção de esquema XML ManuInstructionsSchemaCollection. A coleção tem apenas um namespace de esquema.

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

Opcionalmente, você pode atribuir a coleção de esquema a uma variável e especificar a variável na instrução CREATE XML SCHEMA COLLECTION do seguinte modo:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

A variável do exemplo é do tipo nvarchar(max). A variável também pode ser do tipo de dados xml , nesse caso, ela é convertida implicitamente em uma cadeia de caracteres.

Para obter mais informações, consulte Exibir uma coleção de esquemas XML armazenada.

Você pode armazenar coleções de esquema em uma coluna de tipo xml . Nesse caso, para criar a coleção de esquemas XML, execute as seguintes etapas:

  1. Recupere a coleção de esquemas da coluna usando uma SELECT instrução e atribua-a a uma variável de tipo xml ou a um tipo varchar .

  2. Especifique o nome da variável na CREATE XML SCHEMA COLLECTION instrução.

Os CREATE XML SCHEMA COLLECTION armazenam apenas os componentes de esquema que o SQL Server entende; tudo no esquema XML não é armazenado no banco de dados. Portanto, se você quiser a coleção de esquemas XML de volta exatamente da maneira como ela foi fornecida, salve seus esquemas XML em uma coluna de banco de dados ou alguma outra pasta no computador.

B. Especificar vários namespaces de esquema em uma coleção de esquemas

Você pode especificar vários esquemas XML ao criar uma coleção de esquema XML. Por exemplo:

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

O exemplo a seguir cria a coleção de esquema XML ProductDescriptionSchemaCollection que inclui dois namespaces de esquema 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. Importar um esquema que não especifique um namespace de destino

Se um esquema que não contém um targetNamespace atributo for importado em uma coleção, seus componentes serão associados ao namespace de destino de cadeia de caracteres vazio, conforme mostrado no exemplo a seguir. Não associar um ou mais esquemas importados na coleção faz com que vários componentes de esquema (potencialmente não relacionados) sejam associados ao namespace de cadeia de caracteres vazio padrão.

-- 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. Usar uma coleção de esquemas XML e lotes

Uma coleção de esquemas não pode ser referenciada no mesmo lote em que é criada. Se você tentar fazer referência a uma coleção no mesmo lote em que ela foi criada, receberá um erro informando que a coleção não existe. O exemplo a seguir funciona; no entanto, se você remover GO e, portanto, tentar fazer referência à coleção de esquemaS XML para digitar uma variável XML no mesmo lote, ela retornará um erro.

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