Utilisation de collections de schémas XML sur le serveur — Recommandations et limitations

Mis à jour : 14 avril 2006

La validation XSD (XML Schema Definition Language) des colonnes SQL utilisant le type de données SQL Server 2005 xml fait l'objet de certaines limitations, lesquelles sont exposées dans cette rubrique. Les recommandations à suivre pour modifier un schéma XSD afin qu'il soit compatible avec SQL Server y sont également abordées. Le tableau suivant répertorie ces limitations. Une description plus détaillée de chaque limitation ainsi que des recommandations d'utilisation sont ensuite fournies dans les sections qui suivent le tableau.

Option Limitation

anyType

Les spécifications XQuery recommandent la validation de type lax pour les éléments de type anyType. Étant donné que SQL Server ne prend pas en charge la validation de type lax, la validation de type strict est appliquée aux éléments de type anyType.

minOccurs et maxOccurs

SQL Server limite la taille des valeurs de ces attributs.

sqltypes:datetime et sqltypes:smalldatetime

SQL Server n'accepte pas les valeurs sqltypes:datetime ou sql:smalldatetime.

<xsd:include>, <xsd:key>, <xsd:keyref>, <xsd:redefine> et <xsd:unique>

SQL Server n'accepte pas ces valeurs.

<xsd:choice>

SQL Server refuse les schémas comportant une particule <xsd:choice> sans enfant, sauf si cette particule est définie avec une valeur d'attribut minOccurs de zéro.

Valeurs <xsd:simpleType>

SQL Server prend uniquement en charge la précision à la milliseconde pour les types simples comportant un composant seconde et impose des limites à toutes les énumérations de types simples XSD reconnus.

SQL Server ne prend pas en charge l'utilisation de la valeur « NaN » dans les déclarations <xsd:simpleType>.

xsi:schemaLocation et xsi:noNamespaceSchemaLocation

SQL Server ignore ces attributs s'ils sont présents dans les données d'instance XML insérées dans une colonne ou une variable de type de données xml.

xs:QName

SQL Server ne prend pas en charge les types dérivés de xs:QName utilisant un élément de restriction de schéma XML.

SQL Server ne prend pas en charge les types union avec xs:QName en tant qu'élément de membre.

Ajout de membres à un groupe de substitution existant

SQL Server ne prend pas en charge l'ajout de membres à un groupe de substitution existant dans une collection de schémas XML.

Formes canoniques

La représentation canonique d'une valeur ne peut enfreindre la restriction de modèle pour son type.

Facettes d'énumération

SQL Server ne prend pas en charge les schémas XML avec des types présentant des facettes de modèles ou des énumérations enfreignant ces facettes.

Longueur de facette

SQL Server limite la plage de valeurs acceptables pour la longueur de facette.

Attribut d'ID

Les composants de schéma XML peuvent avoir un attribut d'ID, mais SQL Server ne stocke pas ces valeurs.

Type ID

SQL Server ne prend pas en charge les éléments de type xs:ID ou xs:IDREF.

Validation de type lax

SQL Server ne prend pas en charge la validation de type lax pour les schémas téléchargés vers SQL Server.

Types liste et union

SQL Server ne prend pas en charge les types liste utilisant des types union en guise d'éléments de liste.

Espace de noms local

SQL Server rejette les schémas utilisant une chaîne vide ("") en tant que valeur pour l'attribut d'espace de noms.

Type mixte et contenu simple

SQL Server ne prend pas en charge la restriction d'un type mixte à du contenu simple.

Type NOTATION

SQL Server n'accepte pas les valeurs de type NOTATION.

Conditions de mémoire insuffisante

La manipulation de collections de schémas XML volumineuses peut entraîner des conditions de mémoire insuffisante. Des solutions sont proposées.

Valeurs répétées

SQL Server rejette les schémas où l'attribut block ou final comporte des valeurs répétées.

Identificateurs de composant de schéma

SQL Server limite les identificateurs de composant de schéma à une longueur maximale de 1 000 caractères Unicode. De plus, l'emploi de paires de caractères de substitution au sein des identificateurs n'est pas pris en charge.

Informations de fuseau horaire

Les informations de fuseau horaire sont toujours normalisées en fonction du temps universel coordonné (UTC), également appelé heure GMT (Greenwich Mean Time).

Types union

SQL Server ne prend pas en charge les restrictions des types union.

Décimales de précision de variable

SQL Server ne prend pas en charge les décimales de précision de variable.

xsi:schemaLocation et xsi:noNamespaceSchemaLocation

Les attributs suivants sont ignorés par SQL Server s'ils sont présents dans les données d'instance XML insérées dans une colonne ou une variable de type de données xml.

  • xsi:schemaLocation
  • xsi:noNamespaceSchemaLocation

&lt;xsd:include&gt;

L'élément W3C (World-Wide Web Consortium) XSD include assure la prise en charge de la modularité des schémas, dans laquelle un schéma XML peut être partitionné en plusieurs fichiers physiques. SQL Server ne prend actuellement pas en charge cet élément. Les schémas XML incluant cet élément seront rejetés par le serveur.

En guise de solution, les schémas XML comportant la directive <xsd:include> peuvent être prétraités de façon à copier et à fusionner le contenu de tous les schémas inclus en un seul et unique schéma à télécharger vers le serveur. Pour plus d'informations, consultez Outil du préprocesseur pour les schémas XML.

&lt;xsd:unique&gt;, &lt;xsd:key&gt; et &lt;xsd:keyref&gt;

Actuellement, SQL Server ne prend pas en charge les contraintes basées sur XSD suivantes pour appliquer l'unicité ou établir des clés ou des références de clés :

  • <xsd:unique>
  • <xsd:key>
  • <xsd:keyref>

Les schémas XML contenant ces éléments ne peuvent pas être inscrits.

Formes canoniques et restrictions de modèle

La facette de modèle XSD permet la restriction de l'espace lexical des types simples. Quand une restriction de modèle est appliquée à un type pour lequel il existe plusieurs représentations lexicales possibles, certaines valeurs peuvent entraîner un comportement inattendu lors de la validation. Ce comportement se produit car les représentations lexicales de ces valeurs ne sont pas stockées dans la base de données. Par conséquent, les valeurs sont converties en leurs représentations canoniques lorsqu'elles sont sérialisées pour la sortie. Si un document contient une valeur dont la forme canonique n'est pas conforme à la restriction de modèle propre à son type, il est rejeté si un utilisateur tente de réinsérer la valeur.

Pour empêcher cela, SQL Server 2005 rejette tout document XML comportant des valeurs ne pouvant pas être réinsérées, en raison de la violation des restrictions de modèle par leurs formes canoniques. Ainsi, la valeur « 33 000 » n'est pas validée par rapport à un type dérivé de xs:decimal ayant pour restriction de modèle « 33\.0+ ». Bien que « 33 000 » soit conforme à ce modèle, la forme canonique, « 33 », elle, ne l'est pas.

Par conséquent, soyez prudent lorsque vous appliquez des facettes de modèle à des types dérivés des types primitifs suivants : boolean, decimal, float, double, dateTime, time, date, hexBinary et base64Binary. SQL Server émet un avertissement lorsque vous ajoutez de tels composants à une collection de schémas.

Une sérialisation imprécise de valeurs en virgule flottante donne lieu à un problème similaire. Du fait de l'algorithme de sérialisation en virgule flottante utilisé par SQL Server 2005, il est possible pour des valeurs similaires de partager la même forme canonique. Quand une valeur en virgule flottante est sérialisée puis réinsérée, sa valeur peut varier légèrement. En de rares occasions, cela peut produire une valeur enfreignant l'une des facettes suivantes propres à son type au moment de sa réinsertion : enumeration, minInclusive, minExclusive, maxInclusive ou maxExclusive. Pour éviter ce problème, SQL Server 2005 rejette toutes les valeurs des types dérivés de xs:float ou de xs:double ne pouvant pas être sérialisées et réinsérées.

Caractères génériques et validation de contenu

Les caractères génériques sont utilisés pour accroître la flexibilité en termes d'éléments pouvant apparaître dans un modèle de contenu. Ils sont pris en charge comme suit dans le langage XSD :

  • Caractères génériques d'élément. Ils sont représentés par l'élément <xsd:any>.
  • Caractères génériques d'attribut. Ils sont représentés par l'élément <xsd:anyAttribute>.

Ces deux types de caractères génériques, <xsd:any> et <xsd:anyAttribute>, prennent en charge l'emploi d'un attribut processContents. Grâce à lui, vous pouvez préciser une valeur indiquant comment les applications XML vont gérer la validation du contenu des documents associé à ces éléments de caractères génériques. Les valeurs possibles et leurs effets sont décrits ci-dessous :

  • La valeur strict indique que le contenu est entièrement validé.
  • La valeur skip indique que le contenu n'est pas validé.
  • La valeur lax indique que sont validés uniquement les éléments et les attributs pour lesquels des définitions de schéma sont disponibles.

Validation de type lax

Pour les schémas téléchargés vers SQL Server, la validation de type lax n'est pas prise en charge. Par conséquent, si l'attribut processContents est spécifié par des éléments de caractères génériques, il doit être défini sur skip ou sur strict. Si vous spécifiez processContents="lax", le serveur rejette le schéma.

En raison de ce comportement, tous les éléments typés avec xsd:anyType sont soumis à une validation de type strict. Et donc, leurs attributs et leurs éléments enfants doivent être définis dans la collection de schémas par rapport à laquelle l'instance de document doit être validée.

Éléments anyType

Les spécifications XQuery recommandent la validation de type lax pour les éléments de type anyType. Étant donné que SQL Server ne prend pas en charge la validation de type lax, la validation de type strict est appliquée aux éléments de type anyType.

L'exemple ci-dessous illustre la validation de type strict et crée une collection de schémas XML. L'un des éléments de schéma est du type anyType. Des variables xml typées sont ensuite créées, après quoi la validation de type strict de l'élément de type anyType est illustrée.

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://ns">
   <element name="e" type="anyType"/>
   <element name="a" type="byte"/>
   <element name="b" type="string"/>
 </schema>'
GO

L'exemple ci-dessous aboutit, car la validation de type strict de <e> réussit.

DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><b>data</b></e>'
GO

L'exemple suivant échoue. L'instance est rejetée, car la validation de type strict de l'élément <e> ne trouve pas l'élément <c> défini dans le schéma :

DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><c>Wrong</c><b>data</b></e>'
GO

Ici aussi, l'instance XML de cet exemple est rejetée, car il n'y a pas de déclaration de l'élément <c> dans l'espace de noms http://whatever. En d'autres termes, l'espace de noms n'existe pas.

DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><c xmlns="http://whatever">Wrong</c><b>data</b></e>'
SELECT @var
GO

&lt;xsd:redefine&gt;

L'élément W3C XSD redefine assure la prise en charge de la redéfinition des composants de schéma. Toutefois, la prise en charge de cette directive est potentiellement dommageable en termes de performances et exige en outre que SQL Server revalide toutes les instances de type de données xml associées au schéma redéfini. Par conséquent, SQL Server ne prend actuellement pas en charge cet élément. Les schémas XML incluant l'élément <xsd:redefine> sont rejetés par le serveur.

Au lieu d'utiliser cet élément, vous pouvez mettre à jour un schéma ou ses composants en procédant comme suit :

  1. Annulez le type des colonnes (XML DT) de type de données xml en utilisant la collection de schémas.
  2. Supprimez la collection de schémas XML existante pour l'espace de noms concerné.
  3. Créez une nouvelle collection de schémas XML pour cet espace de noms en y incluant les composants de schéma modifiés.
  4. En utilisant la nouvelle collection, redéfinissez le type de toutes les colonnes dont vous aviez annulé le type à l'étape 1 (XML DT).

xs:QName

SQL Server ne prend pas en charge les types dérivés de xs:QName utilisant un élément de restriction de schéma XML.

Actuellement, SQL Server ne prend pas en charge les types union avec QName en tant que type de membre. Les instructions CREATE XML SCHEMA COLLECTION suivantes ne peuvent pas charger le schéma XML, car ils spécifient le type xs:QName en tant que type de membre de l'union :

CREATE XML SCHEMA COLLECTION QNameLimitation1 AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myUnion">
        <xs:union memberTypes="xs:int xs:QName"/>
    </xs:simpleType>
</xs:schema>'
GO

CREATE XML SCHEMA COLLECTION QNameLimitation2 AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myUnion">
        <xs:union memberTypes="xs:integer">
   <xs:simpleType>
    <xs:list itemType="xs:QName"/>
   </xs:simpleType>
  </xs:union>
    </xs:simpleType>
</xs:schema>'
GO

Ces deux instructions échouent avec une erreur.

Types union en tant qu'éléments d'une liste

Actuellement, SQL Server ne prend pas en charge les schémas contenant des types liste avec pour éléments des types union. L'exemple de schéma suivant illustre une tentative de prise en charge de l'emploi d'un type union en tant qu'élément dans un type liste :

CREATE XML SCHEMA COLLECTION MySampleCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
   <simpleType name="unionType">
      <union memberTypes="string byte"/>
   </simpleType>
   <simpleType name="listType">
      <list itemType="ns:unionType"/>
   </simpleType>
</schema>'
GO

Le schéma est rejeté par le serveur et l'erreur suivante est générée :

« Type d'élément non valide pour le type de liste 'http://ns:listType'. Le type d'élément d'une liste ne peut pas être lui-même une liste ; par ailleurs, les types union et les types dérivés de l'ID ne peuvent pas être utilisés en tant que types d'éléments dans cette version. »

Valeurs pour &lt;xsd:simpleType&gt;

SQL Server prend uniquement en charge la précision à la milliseconde pour les types simples comportant un composant seconde. De plus, sur le serveur, les instances XML avec des valeurs dateTime ne contenant pas de fuseaux horaires sont rejetées. Le tableau suivant décrit les restrictions appliquées, sur base de toutes les énumérations de types simples XSD reconnus.

En outre, SQL Server ne prend pas en charge l'utilisation de la valeur « NaN » dans les déclarations <xsd:simpleType>. Les schémas incluant cette valeur sont rejetés par le serveur.

Type simple Limitation

duration

La partie année doit être comprise entre -2^31 et 2^31-1. Le mois, le jour, l'heure, les minutes et les secondes doivent figurer dans la plage 0-9999. La partie secondes comporte trois chiffres de précision supplémentaires à droite du séparateur décimal.

dateTime

La partie heure dans le sous-champ du fuseau horaire doit être comprise dans la plage valide -14 à +14. La partie année doit être comprise dans la plage -9999 à 9999. La partie mois doit être comprise dans la plage 1 à 12. La partie jour doit être comprise dans la plage 1 à 31 et doit être une date valide du calendrier. Par exemple, SQL Server détecte une date non valide comme 1974-02-31 et retourne une erreur puisque le mois de février ne contient pas 31 jours.

date

La partie année doit être comprise entre -9999 et 9999, et la partie mois entre 1 et 12. La partie jour doit appartenir à la plage 1-31 et doit être une date calendrier valide. Par exemple, SQL Server détecte une date non valide comme 1974-02-31 et retourne une erreur puisque le mois de février ne contient pas 31 jours.

gYearMonth

La partie année doit figurer dans la plage comprise entre -9999 et 9999.

gYear

La partie année doit figurer dans la plage comprise entre -9999 et 9999.

gMonthDay

La partie mois doit être comprise entre 1 et 12, et la partie jour entre 1 et 31.

gDay

La partie jour doit figurer dans la plage comprise entre 1 et 31.

gMonth

La partie mois doit figurer dans la plage comprise entre 1 et 12.

decimal

Les valeurs de ce type doivent être conformes au format du type numérique SQL. Ce format représente en interne la prise en charge des nombres jusqu'à un total de 38 chiffres, 10 de ces positions étant réservées à la précision fractionnelle.

float

Les valeurs de ce type doivent être conformes au format du type real SQL.

double

Les valeurs de ce type doivent être conformes au format du type float SQL.

string

Les valeurs de ce type doivent être conformes au format du type nvarchar(max) SQL.

anyURI

Les valeurs de ce type ne peuvent excéder 4 000 caractères Unicode.

Décimales de précision de variable

Le type xs:decimal représente des nombres de décimales de précision arbitraire. Les processeurs XML conformes minimaux doivent prendre en charge les nombres décimaux avec un minimum de totalDigits=18. SQL Server prend en charge totalDigits=38, mais limite les chiffres fractionnels à 10. SQL Server ne prend pas en charge les décimales de précision de variable. Toutes les valeurs instanciées de xs:decimal sont représentées en interne par le serveur au moyen du type numeric SQL (38, 10).

Informations de fuseau horaire

Pour les types simples date, time et dateTime, les informations de fuseau horaire sont toujours normalisées en fonction du temps universel coordonné (UTC), également appelé heure GMT (Greenwich Mean Time).

Par exemple, le schéma suivant déclare un élément de type dateTime nommé <e> :

CREATE XML SCHEMA COLLECTION MySampleCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
   <element name="e" type="dateTime"/>
</schema>'
GO

Pour les éléments de type dateTime, le serveur convertit l'heure fournie à l'heure GMT en se basant sur la valeur de décalage horaire (« -05:00 ») et en retournant l'heure GMT correspondante.

DECLARE @var XML(MySampleCollection)
SET @var = '<e xmlns="http://ns">1999-05-31T13:20:00-05:00</e>'
SELECT @var
-- time zone is specified. Value is converted to Zulu before being stored
-- will come back as <e xmlns="http://ns">1999-05-31T18:20:00Z</e>
GO

Longueur de facette

Les facettes length, minLength et maxLength sont stockées sous la forme d'un type long, type codé sur 32 bits. Par conséquent, la plage de valeurs acceptables pour ces valeurs est 2^31.

minOccurs et maxOccurs

Les valeurs des attributs minOccurs et maxOccurs doivent tenir dans des entiers à 4 octets. Les schémas non conformes sont rejetés par le serveur.

Identificateurs de composant de schéma

SQL Server limite les identificateurs de composant de schéma à une longueur maximale de 1 000 caractères Unicode et rejette les schémas dont les identificateurs dépassent cette longueur. De plus, l'emploi de paires de caractères de substitution au sein des identificateurs n'est pas pris en charge.

Facettes d'énumération

SQL Server rejette les schémas XML avec des types présentant des facettes de modèles ou des énumérations enfreignant ces facettes. Par exemple, le schéma serait rejeté parce que d'une part, la valeur d'énumération comprend une valeur à casse mixte et que, d'autre part, cette valeur enfreint le modèle limitant les valeurs à des lettres minuscules.

CREATE XML SCHEMA COLLECTION MySampleCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
    <simpleType name="MyST">
       <restriction base="string">
          <pattern value="[a-z]*"/>
       </restriction>
    </simpleType>

    <simpleType name="MyST2">
       <restriction base="ns:MyST">
           <enumeration value="mYstring"/>
       </restriction>
    </simpleType>
</schema>'
GO

&lt;xsd:choice&gt;

SQL Server refuse les schémas comportant une particule <xsd:choice> sans enfant, sauf si cette particule est définie avec une valeur d'attribut minOccurs de zéro.

Valeurs répétées dans un attribut block ou final

L'attribut block permet de bloquer les substitutions de type et d'élément à partir de l'instance. L'attribut final empêche la dérivation à partir d'un type d'autres types complexes.

SQL Server rejette les schémas où l'attribut block ou final comporte des valeurs répétées comme « restriction restriction » et « extension extension ».

Espace de noms local

L'espace de noms local doit être spécifié explicitement pour l'élément <xsd:any>. SQL Server rejette les schémas utilisant une chaîne vide ("") en tant que valeur pour l'attribut d'espace de noms. SQL Server nécessite en lieu et place l'utilisation explicite de « ##local » pour indiquer qu'un élément ou un attribut non qualifié sera utilisé en tant qu'instance du caractère générique.

Attribut d'ID

Chaque composant de schéma XML peut avoir un attribut d'ID. SQL Server applique l'unicité des déclarations <xsd:attribute> de type ID, mais il ne stocke pas ces valeurs. L'étendue pour l'application de l'unicité est l'instruction {CREATE | ALTER} XML SCHEMA COLLECTION.

Type ID

SQL Server ne prend pas en charge les éléments de type xs:ID, xs:IDREF ou xs:IDREFS. Un schéma peut ne pas déclarer les éléments de ce type, ou les éléments dérivés par restriction ou par extension de ce type.

Type NOTATION

SQL Server ne prend actuellement pas en charge le type NOTATION. Les schémas incluant des définitions de notations sont rejetés par le serveur.

Type mixte et contenu simple

Dans la collection de schémas XML suivante, myComplexTypeA est un type complexe pouvant être vidé. En d'autres termes, ses deux éléments ont minOccurs défini sur 0. La tentative de restriction à du contenu simple de la même façon qu'il l'était dans la déclaration myComplexTypeB, n'est pas prise en charge. La création de la collection de schémas XML suivante échoue :

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns"
xmlns:ns1="http://ns1">

    <complexType name="myComplexTypeA" mixed="true">
        <sequence>
            <element name="a" type="string" minOccurs="0"/>
            <element name="b" type="string" minOccurs="0" maxOccurs="23"/>
        </sequence>
    </complexType>


    <complexType name="myComplexTypeB">
        <simpleContent>
            <restriction base="ns:myComplexTypeA">
                <simpleType>
                    <restriction base="int">
                        <minExclusive value="25"/>
                    </restriction>
                </simpleType>
            </restriction>
        </simpleContent>
    </complexType>
</schema>
'
GO

sqltypes:datetime et sqltypes:smalldatetime

Dans SQL Server 2005, tous les types dérivés de xs:date, xs:time et xs:dateTime doivent avoir des fuseaux horaires. Sqltypes:datetime et sqltypes:smalldatetime sont deux exemples de ces types. Cependant, les types SQL datetime et smalldatetime n'ont pas de fuseaux horaires, car ces derniers ne sont pas autorisés par les facettes de modèle de sqltypes:datetime et sqltypes:smalldatetime. Par conséquent, SQL Server n'accepte pas les valeurs sqltypes:datetime ou sql:smalldatetime.

Bien qu'il soit possible de référencer sqltypes:datetime et sqltypes:smalldatetime dans des schémas définis par l'utilisateur, vous ne pouvez pas valider des documents XML contenant des valeurs de ces types. Cela les rend inutilisables. Dans l'exemple ci-dessous, la collection de schémas XML définit l'élément <c> de type sqltypes.datetime :

CREATE XML SCHEMA COLLECTION SC_datetime 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="c" type="s:datetime"/>
                  </sequence>
            </complexType>
      </element>
</schema>'
GO

L'affectation suivante échoue :

DECLARE @var xml(SC_datetime)
SET @var = '<x:root xmlns:x="myNS"><c>1953-01-01T00:00:00.000</c></x:root>'
GO

Ajout de membres à un groupe de substitution existant

Vous ne pouvez pas ajouter des membres à un groupe de substitution existant dans une collection de schémas XML. Un groupe de substitution dans un schéma XML est restreint en cela que l'élément de tête et tous les éléments membres doivent être définis dans la même instruction {CREATE | ALTER} XML SCHEMA COLLECTION. Par exemple, vous pouvez procéder de la façon suivante :

CREATE XML SCHEMA COLLECTION col AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="e1"/>
    <xs:element name="e2" substitutionGroup="e1"/>
</xs:schema>'

Toutefois, vous ne pouvez pas utiliser la syntaxe suivante, où l'élément de tête e1 est défini dans une instruction CREATE XML SCHEMA COLLECTION et le membre de substitution e2, dans une autre instruction ALTER XML SCHEMA COLLECTION :

CREATE XML SCHEMA COLLECTION col AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="e1"/>
</xs:schema>'
GO

ALTER XML SCHEMA COLLECTION col add N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="e2" substitutionGroup="e1"/>

</xs:schema>'
GO

Types union

Les restrictions des types union ne sont pas prises en charge. Par exemple, l'instruction CREATE XML SCHEMA COLLECTION suivante échoue :

CREATE XML SCHEMA COLLECTION particlesIk026valid AS N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xsdtesting" xmlns:x="http://xsdtesting" elementFormDefault="qualified">
    <xsd:simpleType name="U1">
        <xsd:union>
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer" />
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:string" />
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>
    <xsd:simpleType name="U2">
        <xsd:restriction base="x:U1" />
    </xsd:simpleType>
    <xsd:complexType name="B">
        <xsd:choice>
            <xsd:element name="c1" type="x:U1" />
            <xsd:element name="c2" />
        </xsd:choice>
    </xsd:complexType>
    <xsd:complexType name="R">
        <xsd:complexContent>
            <xsd:restriction base="x:B">
                <xsd:choice>
                    <xsd:element name="c1" type="x:U2" />
                    <xsd:element name="c2" />
                </xsd:choice>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name="doc">
        <xsd:complexType>
            <xsd:choice>
                <xsd:element name="elem" type="x:R" />
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>'

Collections de schémas XML volumineuses et conditions de mémoire insuffisante

Lors d'un appel à la fonction intégrée XML_SCHEMA_NAMESPACE() sur une collection de schémas XML de grande taille ou si vous tentez de supprimez une telle collection, une condition de mémoire insuffisante peut se produire. Pour pallier ce problème, envisagez les solutions suivantes :

  • Si la charge imposée au système est faible, utilisez la commande DROP_XML_SCHEMA_COLLECTION. Si cette mesure ne permet pas de résoudre le problème, placez la base de données en mode utilisateur unique à l'aide de l'instruction ALTER DATABASE et réexécutez DROP XML SCHEMA COLLECTION. Si la collection de schémas XML existe dans master, model ou tempdb, un redémarrage du serveur est requis pour passer en mode utilisateur unique.
  • Quand vous appelez XML_SCHEMA_NAMESPACE, essayez d'extraire un espace de noms de schéma XML, tentez l'appel à un moment où la charge système est moindre ou alors en mode utilisateur unique.

Modèles de contenu non déterministes

SQL Server rejette les schémas XML dont le modèle de contenu est non déterministe.

L'exemple suivant cherche à créer un schéma XML dont le modèle de contenu est non déterministe. Le code échoue car il n'est pas certain si l'élément <root> doit avoir une séquence de deux éléments <a> ou si l'élément <root> doit avoir deux séquences, chacune possédant un élément <a>.

CREATE XML SCHEMA COLLECTION MyCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
    <element name="root">
        <complexType>
            <sequence minOccurs="1" maxOccurs="2">
                <element name="a" type="string" minOccurs="1" maxOccurs="2"/>
            </sequence>
        </complexType>
    </element>
</schema>
'
GO

Il est possible de corriger le schéma en déplaçant la contrainte d'occurrence vers un emplacement unique. Par exemple, vous pouvez déplacer la contrainte vers la particule sequence conteneur :

<sequence minOccurs="1" maxOccurs="4">
    <element name="a" type="string" minOccurs="1" maxOccurs="1"/>
</sequence>

Ou vous pouvez la déplacer vers l'élément contenu :

<sequence minOccurs="1" maxOccurs="1">
     <element name="a" type="string" minOccurs="1" maxOccurs="4"/>
</sequence>

Comportement de Service Pack 1 de Microsoft SQL Server 2005

Les modèles de contenu non déterministes sont acceptés si les contraintes d'occurrence sont 0,1, ou non liées.

L'exemple suivant est rejeté dans SQL Server 2005, mais il est accepté par un serveur exécutant SQL Server SP1.

CREATE XML SCHEMA COLLECTION MyCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
    <element name="root">
        <complexType>
            <sequence minOccurs="0" maxOccurs="unbounded">
                <element name="a" type="string" minOccurs="0" maxOccurs="1"/>
                <element name="b" type="string" minOccurs="1" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>
</schema>
'
GO

Voir aussi

Référence

Utilisation de collections de schémas XML sur le serveur — Recommandations et limitations
Autorisations sur une collection de schémas XML
Gestion des collections de schémas XML sur le serveur

Concepts

Type de données xml
XML typé et non typé
Présentation de la contrainte d'attribution de particule unique

Aide et Informations

Assistance sur SQL Server 2005

Historique des modifications

Version Historique

14 avril 2006

Nouveau contenu :
  • Ajout d'une section décrivant comment les modèles de contenu non déterministes sont traités dans SP1.