Compartir a través de


CREAR COLECCIÓN DE ESQUEMAS XML (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

Importa los componentes del esquema a la base de datos.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

relational_schema

Identifica el nombre del esquema relacional. Si no se especifica, se asume el esquema relacional predeterminado.

sql_identifier

Identificador SQL de la colección de esquemas XML.

Expression

Constante de cadena o variable escalar. Es de tipo varchar, varbinary, nvarchar o xml.

Observaciones

También puede agregar nuevos espacios de nombres a la colección o agregar nuevos componentes a espacios de nombres existentes en la colección con ALTER XML SCHEMA COLLECTION.

Para quitar colecciones, use DROP XML SCHEMA COLLECTION.

Permisos

Para crear XML SCHEMA COLLECTION se requieren al menos uno de los siguientes conjuntos de permisos:

  • CONTROL permiso en el servidor
  • ALTER ANY DATABASE permiso en el servidor
  • ALTER permiso en la base de datos
  • CONTROL permiso en la base de datos
  • ALTER ANY SCHEMA permiso y CREATE XML SCHEMA COLLECTION permiso en la base de datos
  • ALTER o CONTROL permiso en el esquema relacional y CREATE XML SCHEMA COLLECTION el permiso en la base de datos

Ejemplos

A. Creación de una colección de esquemas XML en la base de datos

En el ejemplo siguiente se crea la colección de esquemas XML ManuInstructionsSchemaCollection. La colección solo tiene un espacio de nombres 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;

También puede asignar la colección de esquemas a una variable y especificar la variable en la instrucción CREATE XML SCHEMA COLLECTION de la forma siguiente:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

La variable del ejemplo es de tipo nvarchar(max). La variable también puede ser de tipo de datos xml , en cuyo caso, se convierte implícitamente en una cadena.

Para obtener más información, consulte Visualización de una colección de esquemas XML almacenada.

Puede almacenar colecciones de esquemas en una columna de tipo xml . En este caso, para crear una colección de esquemas XML, realice los pasos siguientes:

  1. Recupere la colección de esquemas de la columna mediante una SELECT instrucción y asígnela a una variable de tipo xml o a un tipo varchar .

  2. Especifique el nombre de la variable en la CREATE XML SCHEMA COLLECTION instrucción .

Almacena CREATE XML SCHEMA COLLECTION solo los componentes de esquema que SQL Server entiende; todo en el esquema XML no se almacena en la base de datos. Por lo tanto, si desea que la colección de esquemas XML vuelva exactamente a la forma en que se proporcionó, debe guardar los esquemas XML en una columna de base de datos o en alguna otra carpeta del equipo.

B. Especificar varios espacios de nombres de esquema en una colección de esquemas

Al crear una colección de esquemas XML, puede especificar varios esquemas XML. Por ejemplo:

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

En el ejemplo siguiente se crea la colección de esquemas XML ProductDescriptionSchemaCollection, que incluye dos espacios de nombres 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 un esquema que no especifique un espacio de nombres de destino

Si un esquema que no contiene un targetNamespace atributo se importa en una colección, sus componentes se asocian al espacio de nombres de destino de cadena vacío, como se muestra en el ejemplo siguiente. No asociar uno o varios esquemas importados en la colección hace que varios componentes de esquema (potencialmente no relacionados) estén asociados al espacio de nombres de cadena vacío predeterminado.

-- 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. Uso de una colección de esquemas XML y lotes

No se puede hacer referencia a una colección de esquemas en el mismo lote donde se crea. Si intenta hacer referencia a una colección en el mismo lote en el que se creó, obtendrá un error que indica que la colección no existe. En el ejemplo siguiente se trabaja; sin embargo, si quita GO y, por lo tanto, intenta hacer referencia a la colección de esquemas XML para escribir una variable XML en el mismo lote, devuelve un error.

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