Поделиться через


Канонические формы и ограничения шаблона

Аспект шаблона XSD позволяет вводить ограничение лексического пространства простых типов. Когда ограничение шаблона наложено на тип, для которого есть больше одного возможного лексического представления, некоторые значения могут вызвать непредвиденное поведение в ходе проверки.

Такое поведение возникает, потому что лексические представления этих значений не сохраняются в базе данных. Поэтому значения будут преобразованы к их каноническим представлениям при сериализации вывода. Если документ содержит значение, каноническая форма которого не соответствует ограничению шаблона для его типа, то документ будет отклонен, если пользователь попытается вставить его повторно.

Чтобы это предотвратить, SQL Server отклоняет любой документ XML, содержащий значения, которые не могут быть повторно вставлены из-за нарушения ограничений шаблона их каноническими формами. Например, значение «33.000» не пройдет проверку относительно типа, производного от xs:decimal с ограничением шаблона «33\.0+». Хотя «33.000» соответствует этому шаблону, его каноническая форма «33» шаблону не соответствует.

Поэтому следует быть внимательными при применении аспектов шаблона к типам, полученным из следующих примитивных типов: boolean,decimal, float, double, dateTime, time, date, hexBinary и base64Binary. SQL Server выдаст предупреждение при добавлении любых таких компонентов к коллекции схемы.

Неточная сериализация значений с плавающей запятой вызывает подобную проблему. Из-за алгоритма сериализации с плавающей запятой, используемого SQL Server, для подобных значений можно совместно использовать одну каноническую форму. Когда значение с плавающей запятой сериализовано и затем повторно вставлено, его значение может немного измениться. В редких случаях это может привести к значению, нарушающему любой из следующих аспектов для его типа при повторной вставке: enumeration, minInclusive, minExclusive, maxInclusive или maxExclusive. Чтобы это предотвратить, SQL Server отклоняет любые значения типов, полученных из xs:float или xs:double, которые не могут быть сериализованы и повторно вставлены.