Канонические формы и ограничения шаблона
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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
которые не могут быть сериализованы и повторно добавлены.