Union 和 List 类型
通过使用 XML 架构,可以为允许将值的有限集分配到多值元素和属性的 XML 数据定义数据类型。例如,可以将限制可能值(可以赋给产品定义中AvaliableSizes 元素的值)列表的sizeListType 类型定义为 S、M 和 L。SQL Server 2005 支持包含这些简单类型定义和限制的 XML 架构。例如,可以使用 list 类型定义产品的有效大小,如下面的示例所示。
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="S"/>
<xs:enumeration value="M"/>
<xs:enumeration value="L"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
这个架构声明可用于创建一个能够列出可购买产品中所有大小的元素,该元素列表的值之间用空格隔开,如下面的示例所示:
<AvailableSizes>S M L</AvailableSizes>
然而,如何支持表达产品大小的两种不同方式呢?例如,假设一个自行车设备零销商销售大、中和小号自行车服,同时也销售自行车,并使用与框架大小(如 18、20、22 和 24)相关的数字区分自行车的尺寸。为了满足这个需求,SQL Server 2008 添加了包含 list 类型的 union 类型支持,union 类型可用于将多个 LIST 类型定义和限制合并为一个类型。例如,以下 Transact-SQL 代码创建了一个已定义 productSizeType 类型的XML 架构集合,此 productSizeType 类型中的有效值包含数字大小(18、20、22 和 24)的列表和已命名大小(S、M 和 L)的列表。
N'<?xml version="1.0" encoding="UTF-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="productSizeType">
<xs:union>
<xs:simpleType>
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:enumeration value="18"/>
<xs:enumeration value="20"/>
<xs:enumeration value="22"/>
<xs:enumeration value="24"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
<xs:simpleType>
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="S"/>
<xs:enumeration value="M"/>
<xs:enumeration value="L"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:schema>'
有了架构中的这个声明,基于 productSizeType 的任何元素都能够包含这两种列表中的任何一种;下面例子中的两种产品元素都是 productSizeType 数据类型的有效实例。
<Product>
<ProductName>Road Bike</ProductName>
<AvailableSizes>22 24</AvailableSizes>
</Product>
<Product>
<ProductName>Cycling Jersey</ProductName>
<AvailableSizes>S M L</AvailableSizes>
</Product>
</Catalog>
同样,SQL Server 2008 也支持包含 union 类型的 list 类型的架构声明。