Formes canoniques et restrictions de modèle

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

La facette de modèle XSD permet la restriction de l'espace lexical des types simples. Lorsqu’une restriction de modèle est mise sur 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 parce que 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 ne respecte pas la restriction de modèle pour son type, le document est rejeté si un utilisateur tente de le réinsérer.

Pour éviter cela, SQL Server rejette tout document XML qui contient des valeurs qui ne peuvent pas être réinsérées, en raison de la violation des restrictions de modèle par leurs formes canoniques. Par exemple, la valeur « 33.000 » n’est pas validée par rapport à un type dérivé de xs:decimal avec une restriction de modèle de « 33\.0 + ». Bien que « 33.000 » soit conforme à ce modèle, la forme canonique , « 33 », ne l’est pas.

Par conséquent, vous devez procéder avec prudence lorsque vous appliquez des facettes de modèle à des types dérivés des types primitifs suivants : boolean, decimal, float, double, dateTime, time, date, hexBinaryet base64Binary. SQL Server émet un avertissement lorsque vous ajoutez des composants de ce type à une collection de schémas.

Une sérialisation imprécise de valeurs en virgule flottante donne lieu à un problème similaire. En raison de l’algorithme de sérialisation à virgule flottante utilisé par SQL Server, il est possible que des valeurs similaires partagent 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, maxInclusiveou maxExclusive. Pour éviter cela, SQL Server rejette toutes les valeurs de types dérivés xs:float ou xs:double qui ne peuvent pas être sérialisées et réinsérées.

Voir aussi