Partager via


CRÉER UNE COLLECTION DE SCHÉMA XML (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

Importe les composants d'un schéma dans une base de données.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Arguments

relational_schema

Identifie le nom du schéma relationnel. Si cet argument n’est pas spécifié, le schéma relationnel par défaut est utilisé.

sql_identifier

Identificateur SQL de la collection de schémas XML.

Expression

Variable scalaire ou constante de chaîne. Est de type varchar, varbinary, nvarchar ou xml.

Notes

Vous pouvez également ajouter des espaces de noms à la collection ou ajouter des composants aux espaces de noms existants de la collection, à l’aide de l’instruction ALTER XML SCHEMA COLLECTION.

Pour supprimer des collections, utilisez DROP XML SCHEMA COLLECTION.

Autorisations

CREATE XML SCHEMA COLLECTION nécessite au moins l'un des groupes d'autorisations suivants :

  • CONTROL autorisation sur le serveur
  • ALTER ANY DATABASE autorisation sur le serveur
  • ALTER autorisation sur la base de données
  • CONTROL autorisation dans la base de données
  • ALTER ANY SCHEMA autorisation et CREATE XML SCHEMA COLLECTION autorisation dans la base de données
  • ALTER ou CONTROL autorisation sur le schéma relationnel et CREATE XML SCHEMA COLLECTION l’autorisation dans la base de données

Exemples

R. Créer une collection de schémas XML dans la base de données

Le code exemple suivant crée la collection de schémas XML ManuInstructionsSchemaCollection. La collection comporte un seul espace de noms.

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

Vous pouvez également affecter la collection de schémas à une variable et spécifier celle-ci dans l'instruction CREATE XML SCHEMA COLLECTION comme suit :

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

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

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

La variable de l'exemple est de type nvarchar(max). La variable peut également être de type de données xml , auquel cas elle est implicitement convertie en chaîne.

Pour plus d’informations, consultez Afficher une collection de schémas XML stockée.

Vous pouvez stocker des collections de schémas dans une colonne de type xml . Dans ce cas, pour créer une collection de schémas XML, procédez comme suit :

  1. Récupérez la collection de schémas de la colonne à l’aide d’une SELECT instruction et affectez-la à une variable de type xml ou à un type varchar .

  2. Spécifiez le nom de la variable dans l’instruction CREATE XML SCHEMA COLLECTION .

Les CREATE XML SCHEMA COLLECTION magasins ne stockent que les composants de schéma que SQL Server comprend ; tout ce qui se trouve dans le schéma XML n’est pas stocké dans la base de données. Par conséquent, si vous souhaitez que la collection de schémas XML revient exactement comme elle a été fournie, vous devez enregistrer vos schémas XML dans une colonne de base de données ou un autre dossier sur votre ordinateur.

B. Spécifier plusieurs espaces de noms de schéma dans une collection de schémas

Vous pouvez spécifier plusieurs schémas XML lorsque vous créez une collection de schémas XML. Par exemple :

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

Le code exemple suivant crée la collection de schémas XML ProductDescriptionSchemaCollection qui inclut deux espaces de noms de schémas 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. Importer un schéma qui ne spécifie pas d’espace de noms cible

Si un schéma qui ne contient pas d’attribut targetNamespace est importé dans une collection, ses composants sont associés à l’espace de noms cible de chaîne vide, comme illustré dans l’exemple suivant. L’association d’un ou de plusieurs schémas importés dans la collection entraîne l’association de plusieurs composants de schéma (potentiellement non liés) à l’espace de noms de chaîne vide par défaut.

-- 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. Utiliser une collection de schémas XML et des lots

Une collection de schémas ne peut pas être référencée dans le même lot où elle est créée. Si vous essayez de référencer une collection dans le même lot où elle a été créée, vous obtenez une erreur indiquant que la collection n’existe pas. L’exemple suivant fonctionne ; toutefois, si vous supprimez GO et, par conséquent, essayez de référencer la collection de schémas XML pour taper une variable XML dans le même lot, elle retourne une erreur.

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