Compartir a través de


ALTER XML SCHEMA COLLECTION (Transact-SQL)

Agrega componentes de esquema nuevos a una colección de esquemas XML ya existente.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

ALTER XML SCHEMA COLLECTION [ relational_schema. ]sql_identifier ADD 'Schema Component'

Argumentos

  • relational_schema
    Identifica el nombre del esquema relacional. Si no se especifica, se usará el esquema relacional predeterminado.

  • sql_identifier
    Es el identificador de SQL para la colección de esquemas XML.

  • 'Schema Component'
    Es el componente de esquema que se va a insertar.

Notas

Utilice la instrucción ALTER XML SCHEMA COLLECTION para agregar esquemas XML nuevos cuyos espacios de nombre no se encuentren todavía en la colección de esquemas XML o para agregar componentes nuevos a espacios de nombre ya existentes en la colección.

En el ejemplo siguiente se agrega un <elemento> nuevo al espacio de nombres ya existente http://MySchema/test_xml_schema en la colección MyColl.

-- First create an XML schema collection.
CREATE XML SCHEMA COLLECTION MyColl AS '
   <schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://MySchema/test_xml_schema">
      <element name="root" type="string"/> 
  </schema>'
-- Modify the collection. 
ALTER XML SCHEMA COLLECTION MyColl ADD '
  <schema xmlns="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://MySchema/test_xml_schema"> 
     <element name="anotherElement" type="byte"/> 
 </schema>'

ALTER XML SCHEMA agrega el elemento <anotherElement> al espacio de nombres definido previamente http://MySchema/test_xml_schema.

Tenga en cuenta que si alguno de los componentes que desea agregar a los componentes de referencia de la colección ya existe en dicha colección, debe utilizar <import namespace="referenced_component_namespace" />. No obstante, no se puede utilizar el espacio de nombres del esquema actual en <xsd:import> ni, tampoco, componentes del mismo espacio de nombres de destino, ya que el espacio de nombres del esquema actual se importa automáticamente.

Para quitar colecciones, utilice DROP XML SCHEMA COLLECTION (Transact-SQL).

Si la colección de esquemas ya contiene un carácter comodín de validación lax o un elemento de tipo xs:anyType, al agregar un nuevo elemento, tipo o declaración de atributos global a la colección de esquemas, se producirá una nueva validación de todos los datos almacenados que están restringidos por la colección de esquemas.

Permisos

Para modificar una colección de esquemas XML (XML SCHEMA COLLECTION) es necesario el permiso ALTER sobre la colección.

Para obtener más información, vea Permisos en una colección de esquemas XML.

Ejemplos

A. Crear 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 sólo 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 the collection name 
-- that is 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

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 nvarchar(max)
Set @MySchemaCollection  = N' copy the schema collection here'
CREATE XML SCHEMA COLLECTION AS @MySchemaCollection 

La variable del ejemplo es de tipo nvarchar(max). La variable también puede ser del tipo de datos xml; si es así, se convierte implícitamente a una cadena (string).

Para obtener más información, vea Ver 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 el uso de una instrucción SELECT y asígnela a una variable de tipo xml o varchar.

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

La instrucción CREATE XML SCHEMA COLLECTION sólo almacena los componentes de esquema que SQL Server entiende; no se almacena todo el contenido del esquema XML en la base de datos. Por lo tanto, si desea recuperar la colección de esquemas XML tal como fue suministrada, es recomendable que guarde 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 N'
<xsd:schema>....</xsd:schema>
<xsd:schema>...</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="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. Importar un esquema que no especifique un espacio de nombres de destino

Si un esquema que no contiene el atributo targetNamespace (espacio de nombres de destino) se importa en una colección, sus componentes se asocian al espacio de nombres de destino de cadena vacía, tal como se muestra en el ejemplo siguiente. Tenga en cuenta que si no asocia uno o varios esquemas importados en la colección, varios componentes del esquema (potencialmente no relacionados) se asociarán al espacio de nombres de cadena vacía 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 
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=''