经典形式和模式限制

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 使用的浮点序列化算法,因此类似的值可以共享相同的规范形式。 当浮点值序列化并重新插入时,其值可能会略有变化。 在极少数情况下,这可能会导致其在重新插入时违反如下任一规则:枚举minInclusiveminExclusivemaxInclusivemaxExclusive。 为防止这种情况,SQL Server 拒绝任何从 xs:floatxs:double 派生的、无法被序列化和重新插入的值类型。

另请参阅

服务器上的 XML 架构集合的要求和限制