XML 架构验证增强功能
可以通过强制实施与一个或几个 XSD 架构符合的方法验证 XML 数据。架构为特定 XML 数据结构定义许可的 XML 元素和属性,并通常用于确保包括所有所需数据元素的 XML 文档使用正确的结构。
SQL Server 2005 通过使用 XML 架构集合引入了 XML 数据验证。一般的方法是通过使用CREATE XML SCHEMA COLLECTION 语句创建一个包含 XML 数据架构规则的架构集合,然后在定义 xml 列或变量时,引用架构集合的名称,这些 xml 列或变量必须符合架构集合中的架构规则。这样,SQL Server 就会验证在架构集合的列或变量中插入或更新的、违反架构声明的任何数据。
SQL Server 2005 中的 XML 架构支持实现完整的 XML 规范的大子集,并且包含了大多数通用的 XML 验证场景。SQL Server 2008 扩展了该支持,使其包括以下已经由用户标识的附加架构验证要求:
支持 lax 验证
完全支持dateTime、 time 和 date 验证,包括时区信息保护
改进了对 union 和 list 类型的支持
Lax 验证支持
XML 架构通过 any、anyAttribute 和 anyType 声明支持 XML 文档中的通配符部分。
<xs:sequence>
<xs:element name="CustomerName"/>
<xs:element name="OrderTotal"/>
<xs:any namespace="##other" processContents="skip"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
此架构声明定义了一个命名为 Order 的 XML 元素,该元素必须包括命名为 CustomerName 和 OrderTotal 的子元素。此外,该元素还可以包含不限数量的其他元素,但这些元素应与 Order 类型属于不同的命名空间。下面的 XML 显示了 一个包含使用此架构声明定义的 Order 元素实例的 XML 文档。注意:Order 中还包含一个没有在架构中显式定义的 shp:Delivery 元素。
xmlns:shp="http://adventure-works.com/shipping">
<Order>
<CustomerName>Graeme Malcolm</CustomerName>
<OrderTotal>299.99</OrderTotal>
<shp:Delivery>Express</shp:Delivery>
</Order>
</Invoice>
验证通配符部分依赖于架构定义中通配符部分的 processContents 属性。在 SQL Server 2005 中,架构可以对any 和 anyAttribute 声明使用 skip 和 strict 的 processContents 值。在前面的例子中,通配符元素的 processContents 属性已经设置为 skip,因此没有尝试验证元素的内容。尽管架构集合包括对 shp:Delivery 元素的声明(例如,定义一个有效传递方法列表),但该元素仍然是未验证的,除非在 Order 元素的通配符声明中将 processContents 属性设置为strict。
SQL Server 2008 添加了对第三个验证选项的支持。通过将通配符部分的 processContents 属性设置为 lax,可以对任何含有与它们相关架构声明的元素强制实施验证,但是忽略任何在架构中未定义的元素。继续前面的例子,如果将架构中通配符元素声明的 declaration 属性设置为 lax,并为 shp:Delivery 元素添加一个声明,则在 XML 文档中的 shp:Delivery 元素将被验证。然而,如果替换 shp:Delivery 元素,则文档就包含一个在架构中未定义的元素,此元素将被忽略。
此外,XML 架构规范定义了 anyType 声明,该声明包含 anyType 内容模式的 lax 处理。SQL Server 2005 不支持 lax 处理,因此 anyType 内容会被严格验证。SQL Server 2008支持 anyType 内容的 lax 处理,因此该内容会被正确验证。
完全的 xs:dateTime 支持
可以使用ʹÓà 架构中的¼dateTime 数据类型定义日期和时间数据。日期时间数据表达式的格式为2007-08-01T09:30:00:000Z,这表示协调通用时间 (UTC)的 2007 年ê 8月Ô 日上午9点30分,UTC可由 Z看出。其他时区通过与 UTC 之间的时差表示,例如太平洋标准时间(比 UTC 时间晚 8 小时) 2007 年 12 月 25 日 早晨 6 点可以表示为值 2007-12-25T06:00:00:000-8:00。
XML 架构规范将 dateTime、 date 和 time 数据的时区组件定义为可选项。但在SQL Server 2005 中,则必须为 dateTime、time 和 date 数据提供时区。另外,SQL Server 2005 不保留 dateTime 或 time 数据的时区信息,而是将其规范化为 UTC (例如,如果 XML 中包含值2007-12-25T06:00:00:000-8:00,则 SQL Server 2005 将其规范化为2007-12-25T14:00:00:000Z。)SQL Server 2008删除了这些限制,因此在存储dateTime、date 或 time 数据时可以省略时区信息,并且提供的任何时区信息都将保留。