Partilhar via


CREATE XML SCHEMA COLLECTION (Transact-SQL)

Importa os componentes do esquema para um banco de dados.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • relational_schema
    Identifica o nome do esquema relacional. Se não for especificado, o esquema relacional padrão será usado.

  • sql_identifier
    É o identificador SQL para a 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 as coleções, use DROP XML SCHEMA COLLECTION (Transact-SQL).

Permissões

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

  • Permissão CONTROL no servidor

  • Permissão ALTER ANY DATABASE no servidor

  • Permissão ALTER no banco de dados

  • Permissão CONTROL no banco de dados

  • Permissões ALTER ANY SCHEMA e CREATE XML SCHEMA COLLECTION no banco de dados

  • Permissão ALTER ou CONTROL no esquema relacional e CREATE XML SCHEMA COLLECTION no banco de dados

Exemplos

A. Criando uma coleção de esquemas XML no banco de dados

O exemplo a seguir cria uma coleção de esquemas 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 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

Como opção, é possível atribuir a coleção de esquemas a uma variável e especificar a variável na instrução CREATE XML SCHEMA COLLECTION do seguinte modo:

DECLARE @MySchemaCollection nvarchar(max)
Set @MySchemaCollection  = N' copy the schema collection here'
CREATE XML SCHEMA COLLECTION MyCollection AS @MySchemaCollection 

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

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

Você poderá armazenar coleções de esquemas em uma coluna do tipo xml. Neste caso, para criar a coleção de esquemas XML, faça o seguinte:

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

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

A instrução CREATE XML SCHEMA COLLECTION armazena somente os componentes do esquema reconhecidos pelo SQL Server; nem tudo que está contido no esquema XML é armazenado no banco de dados. Portanto, se desejar que a coleção de esquemas XML volte a ser exatamente igual a quando foi fornecida, recomendamos que você salve os esquemas XML em uma coluna de banco de dados ou em alguma outra pasta do computador.

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

Você pode especificar vários esquemas XML ao criar uma coleção de esquemas 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 esquemas 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="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription" 
    elementFormDefault="qualified" 
    xmlns:mstns="http://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. Importando um esquema que não especifica um namespace de destino

Se um esquema que não contém um atributo targetNamespace for importado em uma coleção, seus componentes serão associados ao namespace de destino de cadeia de caracteres vazia, como mostra o exemplo a seguir. A não associação de um ou mais esquemas importados na coleção resulta na associação de vários componentes de esquema (possivelmente não relacionados) ao namespace padrão da cadeia de caracteres vazia.

-- 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 
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. Usando 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 referenciar uma coleção no mesmo lote em que foi criada, receberá um erro informando que a coleção não existe. O exemplo a seguir funciona; entretanto, se você remover GO e tentar referenciar a coleção de esquemas XML para digitar uma variável xml no mesmo lote, será retornado 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