Condividi tramite


CREA UNA COLLEZIONE DI SCHEMA XML (Transact-SQL)

Si applica a:SQL ServerAzure SQL DatabaseAzure SQL Istanza gestitaDatabase SQL in Microsoft Fabric

Importa i componenti di schema in un database.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

relational_schema

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

sql_identifier

Identificatore SQL per la raccolta di XML Schema.

Expression

Costante stringa o variabile scalare. È di tipo varchar, varbinary, nvarchar, o xml.

Osservazioni:

È anche possibile aggiungere nuovi spazi dei nomi alla raccolta oppure nuovi componenti a spazi dei nomi esistenti nella raccolta mediante ALTER XML SCHEMA COLLECTION.

Per rimuovere le raccolte, usare DROP XML SCHEMA COLLECTION.

Autorizzazioni

Per creare un'istruzione XML SCHEMA COLLECTION, è richiesto almeno uno dei set di autorizzazioni seguenti:

  • CONTROL autorizzazione per il server
  • ALTER ANY DATABASE autorizzazione per il server
  • ALTER autorizzazione per il database
  • CONTROL autorizzazione nel database
  • ALTER ANY SCHEMA autorizzazione e CREATE XML SCHEMA COLLECTION autorizzazione nel database
  • ALTER o CONTROL autorizzazione per lo schema relazionale e CREATE XML SCHEMA COLLECTION l'autorizzazione nel database

Esempi

R. Creare 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 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;

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 AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

La variabile utilizzata nell'esempio è di tipo nvarchar(max). La variabile può anche essere di tipo di dati xml , nel qual caso viene convertita in modo implicito in una stringa.

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

È possibile archiviare raccolte di schemi in una colonna di tipo xml . In questo caso, per creare una raccolta di XML Schema, seguire questa procedura:

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

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

CREATE XML SCHEMA COLLECTION Archivia solo i componenti dello schema che SQL Server riconosce. Tutti gli elementi nello schema XML non vengono archiviati nel database. Pertanto, se si desidera che la raccolta di XML Schema venga restituita esattamente nel modo in cui è stata fornita, è necessario salvare gli XML Schema in una colonna di database o in un'altra cartella nel computer.

B. Specificare più spazi dei nomi dello schema in una raccolta di schemi

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

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

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. Importare uno schema che non specifica uno spazio dei nomi di destinazione

Se uno schema che non contiene un targetNamespace attributo viene importato in una raccolta, i relativi componenti sono associati allo spazio dei nomi di destinazione stringa vuoto, come illustrato nell'esempio seguente. L'associazione di uno o più schemi importati nella raccolta causa l'associazione di più componenti dello schema (potenzialmente non correlati) allo spazio dei nomi stringa vuota predefinito.

-- 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. Usare una raccolta e batch di XML Schema

Non è possibile fare riferimento a una raccolta di schemi nello stesso batch in cui è stata creata. Se si tenta di fare riferimento a una raccolta nello stesso batch in cui è stata creata, viene visualizzato un errore che indica che la raccolta non esiste. L'esempio seguente funziona; Tuttavia, se si rimuove GO e, di conseguenza, si tenta di fare riferimento alla raccolta di XML Schema per digitare una variabile XML nello stesso batch, viene restituito un errore.

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