Condividi tramite


ALTER XML SCHEMA COLLECTION (Transact-SQL)

Si applica a: SQL Server Istanza gestita di SQL di Azure

Aggiunge nuovi componenti di schema a una raccolta di XML Schema esistente.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

relational_schema
Identifica il nome dello schema relazionale. Se viene omesso, viene utilizzato lo schema relazionale predefinito.

sql_identifier
Identificatore SQL per la raccolta di XML Schema.

' Schema Component '
Componente dello schema da inserire.

Osservazioni:

Utilizzare ALTER XML SCHEMA COLLECTION per aggiungere nuovi XML Schema i cui spazi dei nomi non sono già nella raccolta di XML Schema, oppure per aggiungere nuovi componenti a spazi dei nomi esistenti nella raccolta.

Nell'esempio seguente viene aggiunto un nuovo <elemento> allo spazio dei nomi esistente https://MySchema/test_xml_schema nella raccolta MyColl.

-- First create an XML schema collection.  
CREATE XML SCHEMA COLLECTION MyColl AS '  
   <schema   
    xmlns="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="https://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="https://MySchema/test_xml_schema">   
     <element name="anotherElement" type="byte"/>   
 </schema>';  

ALTER XML SCHEMA aggiunge l'elemento specificato in <anotherElement> allo spazio dei nomi definito precedentemente https://MySchema/test_xml_schema.

Si noti che se alcuni dei componenti che si desidera aggiungere alla raccolta fanno riferimento a componenti che sono già nella stessa raccolta, è necessario utilizzare <import namespace="referenced_component_namespace" />. Tuttavia, non è consentito utilizzare lo spazio dei nomi dello schema corrente in <xsd:import> e pertanto i componenti dello spazio dei nomi di destinazione corrispondente allo spazio dei nomi dello schema corrente vengono importati automaticamente.

Per rimuovere raccolte, usare DROP XML SCHEMA COLLECTION (Transact-SQL).

Se la raccolta di schemi contiene già una carattere jolly di convalida lax o un elemento di tipo xs:anyType, l'aggiunta di una nuova dichiarazione di elemento globale, tipo o attributo alla raccolta di schemi comporterà una riconvalida di tutti i dati archiviati vincolati dalla raccolta di schemi.

Autorizzazioni

Per modificare XML SCHEMA COLLECTION è richiesta l'autorizzazione ALTER per la raccolta.

Esempi

R. Creazione di una raccolta di XML Schema nel database

Nell'esempio corrente viene creata la raccolta di XML Schema ManuInstructionsSchemaCollection. La raccolta ha solo uno spazio dei nomi di schema.

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

In alternativa, è possibile assegnare la raccolta di schemi a una variabile e specificare la variabile nell'istruzione CREATE XML SCHEMA COLLECTION nel modo descritto di seguito:

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

La variabile utilizzata nell'esempio è di tipo nvarchar(max). È anche possibile usare una variabile di tipo xml, che viene convertita implicitamente in una stringa.

Per altre informazioni, vedere Visualizzare una raccolta di XML Schema archiviata.

È possibile archiviare le raccolte di schemi in una colonna di tipo xml. In questo caso, per creare una raccolta di XML Schema, eseguire la procedura seguente:

  1. Recuperare la raccolta di schemi dalla colonna tramite un'istruzione SELECT e assegnarla a una variabile di tipo xml o varchar.

  2. Specificare il nome della variabile nell'istruzione CREATE XML SCHEMA COLLECTION.

L'istruzione CREATE XML SCHEMA COLLECTION archivia solo i componenti di schema supportati da SQL Server. Il contenuto dell'XML Schema non viene archiviato nel database. Pertanto, se si desidera una copia esatta della raccolta di XML Schema, è consigliabile salvare gli XML Schema in una colonna di database o in un'altra cartella nel computer.

B. Specifica di spazi dei nomi relativi a più schemi in una raccolta di schemi

È possibile specificare più XML Schema quando si crea una raccolta di XML Schema. Ad esempio:

CREATE XML SCHEMA COLLECTION N'  
<xsd:schema>....</xsd:schema>  
<xsd:schema>...</xsd:schema>';  

Nell'esempio seguente viene creata la raccolta di XML Schema ProductDescriptionSchemaCollection che include spazi dei nomi relativi a due XML Schema.

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. Importazione di uno schema che non consente di specificare uno spazio dei nomi di destinazione

Se uno schema che non contiene un attributo targetNamespace viene importato in una raccolta, i relativi componenti vengono associati allo spazio dei nomi di destinazione della stringa vuota come illustrato nell'esempio seguente. Si noti che la mancata associazione di uno o più schemi importati nella raccolta risulta nell'associazione di più componenti di schema (potenzialmente non correlati) allo spazio dei nomi predefinito della stringa vuota.

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

Vedi anche

CREATE XML SCHEMA COLLECTION (Transact-SQL)
DROP XML SCHEMA COLLECTION (Transact-SQL)
EVENTDATA (Transact-SQL)
Confrontare dati XML tipizzati con dati XML non tipizzati
Requisiti e limitazioni per le raccolte di XML Schema nel server