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

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

Аспект шаблона 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 которые не могут быть сериализованы и повторно добавлены.

См. также