SQL Server 2008中的XML-XML数据类型(续)
SQL server 2005中引入了一个新的数据类型:xml.这个新数据类型是用来操作XML数据的,现在SQL Server 2008进一步增强了它的功能。使用这种新的数据类型,可以以本机格式存储 XML、 查询 XML 中的数据、 轻松有效地修改 XML 中的数据且无需涉及改动全部的内容,同样也可以索引XML中的数据。
XML数据类型可以像其它数据一样也可以设置是否可空、设置其默认值以及设置它的约束。如果你想使一个xml字段必须有值且为它提供默认值,你只要像如下指定即可:
CREATE TABLE OrdersXML (OrderDocID INT PRIMARY KEY, xOrders XML NOT NULL DEFAULT '<Orders/>')
下列代码也成功运行,是因为它使用了xOrders字段的默认值:
INSERT INTO OrdersXML (OrderDocID, xOrders) VALUES (3, '<blah>steve</blah>')
XML架构(XML Schemas)
XML数据类型的一个强大之处是可以在XML文档中输入强数据类型的能力。XSD(XML架构定义)定义了一组标准,这个标准必须在所有的XML 文档中支持的数据类型。您可以为您的数据创建 XML 架构,要求数据符合一组指定的规则。这使 XML 优越于几乎所有其他数据传输/数据描述方法,也是XML 标准成功一个主要因素。
如果没有XML架构,XML可能只是相对先进、以文本分隔的格式。XML 架构定义了数据应该是什么样子,什么元素是必须的,会有哪些数据类型。类似 SQL Server 中的表定义提供如何对关系数据的结构和类型进行验证, XML 架构提供 XML 数据的结构和类型验证。
我们无法在这里完全描述XML 架构的所有功能,因为这需要大量篇幅。您可以在 http://www.w3.org/2001/XMLSchema 找到 XSD 规范。几个受欢迎的架构是公开的,提供包括一个为博客、blogcasts提供支持的真正简单聚合协议 (Really Simple ,RSS),和为二进制文件和文本聚合提供支持的协议,另一个用于该指示 XML Web 服务如何传递信息的 SOAP。
您可以选择如何构建您的 XSD。XSD 可以创建必需的元素,并设置限制,允许哪些数据类型和范围。它甚至可以允许文档片段。
SQL Server 架构集合(Schema Collections)
SQL Server 2005 提供了创建您自己的架构,作为数据库对象并将其存储在数据库中的能力,且为任何 XML 实例提供验证,包括表中的XML字段和 SQL Server 变量。这使您可以更好地控制要存储到数据库中的 XML数据,并可以使XML 实例是强类型的。SQL Server 2008以下列 增强了这种支持:
- 保留 xsd:dateTime 值中的时区
- 宽松的验证
- 架构中的联合和列表类型
在你深入研究这些新的特性之前,你应该回顾一下架构是如何与SQL Server一起工作的。开始之间,你要先创建一个简单的架构,并将其添加到架构集合中:
--syntax for adding a schema
--schema can disallow fragments if you say so
CREATE XML SCHEMA COLLECTION dbo.order_xsd
AS
'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="orderAmt" >
<xsd:restriction base="xsd:int" >
<xsd:maxExclusive value="5000" />
<xsd:minInclusive value="1" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="Order">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CustomerName" type="xsd:string" />
<xsd:element name="OrderDate" type="xsd:dateTime"/>
<xsd:element name="OrderAmt" type="orderAmt"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>'
GO
|
此架构命名为 order_xsd,并可以在包括变量、 参数、 返回值和特别是表中的列上的xml 类型上使用它。此架构定义了名为 CustomerName、 OrderDate 和 OrderAmt 的元素。OrderAmt 使用了orderAmt类型,orderAmt定义为一个 int 数据类型,它的最小值为 1,它的最大值是 4999 的 orderAmt 类型。(我们知道您将很可能不会这样为您的数据建模,这样一来,但您可能处于用于显示等的目的需要将您关系数据转换成 XML,然后通过一个 XSD 类型进行限制,这是非常有价值的)。接下来,创建一个简单的表并应用架构到 XML 列,这需要在CREATE TABLE 语句中的 xml 数据类型后的括号中引用架构名称,如下所示:
--create table with xml column and use schema as a rule for a particular column CREATE TABLE xml_schematest ( Order_ID int PRIMARY KEY, Order_XML xml(order_xsd) --XML Schema Name ) GO |
在此示例中,您可以看到,Order_XML 列定义为 xml(order_xsd) 而不是简单的 xml。xml 数据类型有一个可选的参数,允许您指定绑定的架构。如果您要将架构绑定到一个变量或参数等之类的 xml 数据类型,也是的同样方法。这样SQL Server 在 Order_XML 列中允许只是强类型化的 XML 文档。这方法比CHECK约束要好。使用 XML 架构的优点是确保只有正确的 XML 数据才能存储到表中。如果使用了 CHECK 约束,你将需要为你想要执行的每个验证绑定一个单独的 CHECK 约束。
注意:在创建 xml 列时您定义的任何默认值必须是有效的,并和该列绑定的架构没有冲突; 否则,默认值总是失败的。此外,请确保定义的任何约束也是有效的,并和该列绑定的架构没有冲突; 否则,插入或更新数据的所有尝试可能会都失败。
让我们看一个有关架构的例子:
INSERT INTO xml_schematest VALUES (1, ' <Order> <CustomerName>Bill Gates</CustomerName> <OrderDate>2008-10-10T14:22:27.25-05:00</OrderDate> <OrderAmt>100</OrderAmt> </Order>') --This will fail INSERT INTO xml_schematest VALUES (2, ' <Order> <CustomerName>Steve Ballmer</CustomerName> <OrderDate>2008-10-10T14:22:27.25-05:00</OrderDate> <OrderAmt>10000</OrderAmt> </Order>') |
SQL Server 执行插入和更新时将验证架构,确保数据的完整性。由于我们所提供的数据符合该架构,插入将会成功。如果您尝试插入或更新一个无效的数据片段,您将收到一个错误:
UPDATE xml_schematest SET Order_XML=' <Order> <CustomerName>Bill Gates</CustomerName> <OrderDate>2008-10-10T14:22:27.25-05:00</OrderDate> <OrderAmt>10000</OrderAmt> </Order>' WHERE Order_ID=1 |
SQL Server将报告如下的错误:
| Msg 6926, Level 16, State 1, Line 1 XML Validation: Invalid simple type value: ’10000′. Location: /*:Order[1]/*:OrderAmt[1] |
(未完待续)
本文首发地址张文杰博客:http://zhangwenjie.net(转载请保留)