标题: SQL Server 2008中有关XML的新功能 [打印本页] 作者: superadmin 时间: 2008-6-4 14:46 标题: SQL Server 2008中有关XML的新功能 1 导言
Microsoft 在Microsoft SQL Server 2000中推出了与XML相关的功能以及Transact-SQL 关键字FOR XML和OPENXML ,这使得开发人员可以编写Transact-SQL代码来获取XML流形式的查询结果,并将一个XML文档分割成一个rowset。SQL Server 2005显著的扩展了这些XML功能,推出了一个支持XSD schema验证、基于XQuery的操作和XML索引的本地的xml 数据类型。SQL Server 2008建立在之前版本的XML功能基础之上,做了改进来迎接客户在存储和操纵数据库中的XML数据时所面临的挑战。
2 SQL Server XML 功能的发展历程
SQL Server的XML功能随着从SQL Server2000版本以来的每一个版本而不断发展。在我们检查SQL Server 2008中的改进之前,通过之前的版本来总结XML功能的发展历程可能会比较有用。
2.1 SQL Server 2000中的XML功能
在SQL Server 2000中,Microsoft 推出了Transact-SQL 关键字FOR XML和OPENXML。FOR XML 是对SELECT语句的扩展,它返回如下面的示例所示的XML流式的查询结果。
SQL Server 2005中的另外一个显著的与XML相关的特性是对XML索引的支持。你可以为类型化xml的列创建首要和次要的XML索引来增强XML查询性能,一个首要的XML索引是一个XML实例的所有节点的部分表示,查询处理器可以使用它来快速的找到一个XML值中的节点。在你创建了一个首要的XML索引之后,你可以创建次要的XML索引来提高特定的查询类型的性能。下面的示例创建了一个首要的XML索引,和一个PATH类型的次要XML索引,它可以提高使用XPath表达式来标识一个XML实例中的节点的查询的性能。
CREATEPRIMARYXMLINDEXidx_xml_Notes
ONSalesOrders(Notes)
GO
CREATEXMLINDEXidx_xml_Path_Notes
ONSalesOrders(Notes)
USINGXMLINDEXidx_xml_Notes
FORPATH
GO作者: superadmin 时间: 2008-6-4 14:54
2.3 SQL Server 2008中的XML功能
XML功能是在SQL Server 2000和SQL Server 2005中推出的,在SQL Server 2008中得到了增强。在SQL Server 2008中主要的与XML相关的改进包括:
· 改进了schema 验证能力
· 增强了对XQuery 的支持
· 增强了XML数据操纵语言(DML)的插入功能
本篇白皮书的其余部分描述了这些增强之处,并介绍了你怎样在SQL Server 2008中使用它们来实现更好的XML解决方案。
对通配符的验证取决于在schema定义中的通配符的processContents 属性。在SQL Server 2005中,schema可以使用用于any和anyAttribute声明的skip和strict 的processContents值。在前面的示例中,这个通配符元素的processContents属性被设置为skip,所以不会对这个元素的内容进行验证。即使这个schema集合包含一个对shp:Delivery元素的声明(例如,定义一组有效的发送方法对Order元素中的通配符),这个元素也不会被验证,除非在Order元素中对通配符的声明将它的processContents属性设置为strict。
SQL Server 2008增加了对第三方验证的支持。通过将一个通配符的processContents属性设置为lax ,你可以对具有相应的schema 声明的任何元素进行验证,但忽略没有在schema 中定义的所有元素。继续前面的示例,如果你将schema中对通配符元素的声明中的processContents属性设置为lax 并增加一个对shp:Delivery元素的声明,那么在XML文档中的shp:Delivery 元素会被进行验证。然而,如果不是shp:Delivery 元素,而是该文档包含了一个没有在schema中声明的元素,那么这个元素会被忽略掉。
此外,XML Schema 规格定义anyType声明具有对它的内容模型的lax处理方式。SQL Server 2005不支持lax处理,所以会严格的对内容进行验证。SQL Server 2008支持anyType 内容的lax处理,因此内容会被正确的进行验证。
XML Schema 规格定义了可选择的dateTime、date和time 数据类型的时区组件。然而,在SQL Server 2005中你必须提供一个用于dateTime、date和time数据的时区。此外,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数据时你可以省略时区信息,并且你提供的任何时区信息都会被保存下来。作者: superadmin 时间: 2008-6-4 14:54
3.3 Union和List类型
你可以使用XML schema 将你的XML数据的数据类型定义为允许将一个有限集合的值赋给具有多个值的元素和属性。例如,你可能定义一个sizeListType类型,它使产品定义中的一个AvaliableSizes元素的赋值限制为S、M和L。SQL Server 2005支持XML schema包含这些简单的类型定义和限制。例如,你可以使用一个list类型来定义一个产品的有效的型号,如下面的示例所示:
然而,如果你想支持两种不同的方式来表达一个产品的型号呢?例如,假设一个自行车产品零售商卖具有大、中、小型号的骑自行车穿的衣服,但是还想按照衣服尺寸来卖(例如18、20、22和24)?为了使你能够这样做,SQL Server 2008增加了对包含list类型的union类型的支持,你可以使用它将多个类型定义和限制合并到一个单独的类型中去。例如,下面的Transact-SQL代码创建了一个XML schema集合,它定义了一个productSizeType类型,其中有效值包括一组数字型号(18、20、22和24)和一组名称型号(S、M和L)。
类似的,SQL Server 2008支持对包含union 类型的list 类型的schema 声明。
4 增强了XQuery
SQL Server 2005推出了xml 数据类型,它提供了一些你可以使用的方法来对存储在一个列或变量中的XML数据进行操作。你可以执行的大多数操作都使用XQuery语法来操纵和使用XML数据。SQL Server 2005所支持的XQuery 语法包括被称作FLWOR 表达式的for、where、order by和return 条件子句,你可以使用它来循环迭代一个XML文档的节点和返回结果值。
SQL Server 2008增加了对let条件子句的支持,它是用来在XQuery表达式中对变量进行赋值的,例如下面的示例:
declare @x xml
set @x=
'<Invoices>
<Invoice>
<Customer>Kim Abercrombie</Customer>
<Items>
<Item ProductID="2" Price="1.99" Quantity="1" />
<Item ProductID="3" Price="2.99" Quantity="2" />
<Item ProductID="5" Price="1.99" Quantity="1" />
</Items>
</Invoice>
<Invoice>
<Customer>Margaret Smith</Customer>
<Items>
<Item ProductID="2" Price="1.99" Quantity="1"/>
</Items>
</Invoice>
</Invoices>'
SELECT @x.query(
'<Orders>
{
for $invoice in /Invoices/Invoice
let $count :=count($invoice/Items/Item)
order by $count
return
<Order>
{$invoice/Customer}
<ItemCount>{$count}</ItemCount>
</Order>
}
</Orders>')