Référencer la collection de schémas XML intégrée (sys)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Chaque base de données que vous créez a une collection de schémas XML sys prédéfinie dans le schéma relationnel sys . Elle réserve ces schémas prédéfinis, qui sont accessibles à toute autre collection de schémas XML créés par l'utilisateur. Les préfixes utilisés dans ces schémas prédéfinis ont une signification dans XQuery. Seul xml est un préfixe réservé.

xml = http://www.w3.org/XML/1998/namespace
xs = http://www.w3.org/2001/XMLSchema
xsi = http://www.w3.org/2001/XMLSchema-instance
fn = http://www.w3.org/2004/07/xpath-functions
sqltypes = https://schemas.microsoft.com/sqlserver/2004/sqltypes
xdt = http://www.w3.org/2004/07/xpath-datatypes
(no prefix) = urn:schemas-microsoft-com:xml-sql
(no prefix) = https://schemas.microsoft.com/sqlserver/2004/SOAP

L’espace de noms sqltypes contient des composants qui peuvent être référencés à partir de n’importe quelle collection de schémas XML créée par l’utilisateur. Vous pouvez télécharger le schéma sqltypes à partir de ce site web de Microsoft. Les composants intégrés incluent les éléments suivants :

  • Types XSD

  • Attributs XML lang, baseet space

  • Composants de l’espace de noms sqltypes

La requête ci-dessous retourne les composants intégrés qui peuvent être référencés à partir d'une collection de schémas XML créés par l'utilisateur :

SELECT C.name, N.name, C.symbol_space_desc from sys.xml_schema_components C join sys.xml_schema_namespaces N
on ((C.xml_namespace_id = N.xml_namespace_id) AND (C.xml_collection_id = N.xml_collection_id))
join sys.xml_schema_collections SC
on SC.xml_collection_id = C.xml_collection_id
where ((C.xml_collection_id = 1) AND (C.name is not null) AND (C.scoping_xml_component_id is null)
AND (SC.schema_id = 4));
GO

L'exemple suivant montre comment ces composants sont référencés dans un schéma utilisateur. CREATE XML SCHEMA COLLECTION crée une collection de schémas XML qui fait référence au type varchar défini dans l’espace de noms sqltypes . L'exemple référence également l'attribut lang défini dans l'espace de noms xml .

CREATE XML SCHEMA COLLECTION SC AS '
<schema
   xmlns="http://www.w3.org/2001/XMLSchema"
   targetNamespace="myNS"
   xmlns:ns="myNS"
   xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes" >
   <import namespace="http://www.w3.org/XML/1998/namespace"/>
   <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
   <element name="root">
      <complexType>
          <sequence>
             <element name="a" type="string"/>
             <element name="b" type="string"/>
             <!-- varchar type is defined in the sys.sys collection and
                  can be referenced in any user-defined schema -->
             <element name="c" type="s:varchar"/>
          </sequence>
          <attribute name="att" type="int"/>
          <!-- xml:lang attribute is defined in the sys.sys collection
               and can be referenced in any user-defined schema -->
          <attribute ref="xml:lang"/>
      </complexType>
    </element>
</schema>';
GO
-- Cleanup
DROP xml schema collection SC;
GO

Notez les points suivants :

  • Vous ne pouvez pas modifier les schémas XML avec ces espaces de noms dans n’importe quelle collection de schémas XML définie par l’utilisateur. Par exemple, la collection de schémas XML suivante échoue, car elle ajoute un composant à l’espace sqltypes de noms protégé :

    CREATE XML SCHEMA COLLECTION SC AS '
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace
        ="https://schemas.microsoft.com/sqlserver/2004/sqltypes" >
          <element name="root" type="string"/>
    </schema>';
    GO
    
  • Vous ne pouvez pas utiliser la sys collection de schémas XML pour taper xml des colonnes, des variables ou des paramètres. Par exemple, le code suivant retourne une erreur :

    DECLARE @x xml (sys.sys);
    
  • La sérialisation de ces schémas intégrés n’est pas prise en charge. Par exemple, le code suivant retourne une erreur :

    SELECT XML_SCHEMA_NAMESPACE(N'sys', N'sys')l
    GO
    

Le code suivant est un autre exemple dans lequel vous créez une collection de schémas XML qui utilise le type varchar défini dans l'espace de noms sqltypes :

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="myNS" xmlns:ns="myNS"
        xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
   <import
     namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
      <simpleType name="myType">
            <restriction base="s:varchar">
                  <maxLength value="20"/>
            </restriction>
      </simpleType>
      <element name="root" type="ns:myType"/>
</schema>';
GO

Comme indiqué ci-dessous, vous pouvez créer une variable typée XML , lui attribuer une instance XML et vérifier que la valeur du <root> type d’élément est un varchar type.

DECLARE @var XML(SC);
SET @var = '<root xmlns="myNS">My data</root>'
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";
declare namespace ns="myNS";
data(/ns:root[1]) instance of sqltypes:varchar?');
GO

L’expression instance of sqltypes:varchar? retourne TRUE, car la valeur de l’élément <root> est d’un type dérivé de varchar selon le schéma associé à la @var variable.

Voir aussi