SQL Server XML 功能的演变
SQL Server 的 XML 功能随着 SQL Server 2000 及其后续每个版本的发布不断演变。在介绍 SQL Server 2008 中的增强功能之前,概述以前版本中 XML 功能的演变很有用。
SQL Server 2000 中的 XML 功能
在 SQL Server 2000 中,Microsoft 引入了 FOR XML 和 OPENXML Transact-SQL 关键字。FOR XML 是 SELECT 语句的扩展,它返回的查询结果是 XML 流,如下面的示例所示。
FROM Products Product
FOR XML AUTO
此次查询返回一个 XML 片段,如下面的示例所示。
<Product ProductID="2" ProductName="Sprocket"/>
OPENXML 功能通过从 XML 文档中创建行集的方法执行与 FOR XML 语句相反的功能,如下面的示例所示。
SET @doc = '<Order OrderID = "1011">
<Item ProductID="1" Quantity="2"/>
<Item ProductID="2" Quantity="1"/>
</Order>'
DECLARE @xmlDoc integer
EXEC sp_xml_preparedocument @xmlDoc OUTPUT, @doc
SELECT * FROM
OPENXML (@xmlDoc, 'Order/Item', 1)
WITH
(OrderID integer '../@OrderID',
ProductID integer,
Quantity integer)
EXEC sp_xml_removedocument @xmlDoc
注意,使用 sp_xml_preparedocument 和 sp_xml_removedocument 存储过程为 XML 文档创建节点树的内存表示。这段Transact-SQL 代码返回如下行集。
OrderID ProductID Quantity
1011 1 2
1011 2 1
SQL Server 2005 中的 XML 功能
在Ú SQL Server 2005中,FOR XML 功能新增了根元素和元素名称的新选项,增强了嵌套ËǶÌ× FOR调用的能力,因此可以构建复杂的层次结构,新增的Ä PATH模式允许定义使用ʹÓà Xp语法进行检索的 XML 结构,如下面的示例所示
ProductName AS 'ProductName'
FROM Products
FOR XML PATH ('Product'), ROOT ('Products')
此次查询返回如下 XML。
<Products>
<Product ProductID="1">
<ProductName>Widget</ProductName>
</Product>
<Product ProductID="2">
<ProductName>Sprocket</ProductName>
</Product>
</Products>
除了增强了 SQL Server 2000 中的现有 XML 功能,SQL Server 2005 还添加了一种新的、本地 xml 数据类型,此数据类型能够用于为 XML 数据创建变量和列,如下面的示例所示。
(OrderID integer PRIMARY KEY,
OrderDate datetime,
CustomerID integer,
OrderNotes xml)
可以使用 xml 数据类型存储数据库中的标记文档或半结构化数据。列和变量可以用于非类型 XML 和类型 XML,其中后者是由 XML 架构定义 (XSD) 架构验证的。开发人员可以使用 CREATE XML SCHEMA COLLECTION 语句为数据验证定义架构,如下面的示例所示。
'<?xml version="1.0" encoding="UTF-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- schema declarations go here -->
</xs:schema>
创建架构集合后,可以通过引用该架构集合并使用其包含的架构声明关联 xml 变量或列,如下面的示例所示。
(OrderID integer PRIMARY KEY,
OrderDate datetime,
CustomerID integer,
OrderNotes xml(ProductSchema))
在插入或更新值时,相关架构集合中的声明将验证类型 XML,出于符合或兼容性原因,有可能强制实施 XML 数据结构的业务规则。
xml 数据类型也提供了一些方法,这些方法可以用于在实例中查询和操纵 XML 数据。例如,可以在 xml 数据类型的实例中使用 query 方法查询 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(
'<CustomerList>
{
for $invoice in /Invoices/Invoice
return $invoice/Customer
}
</CustomerList>')
这个例子中的查询使用了用于在文档中查找每个 Invoice 元素的 XQuery 表达式,并且从每个 Invoice 元素返回包含 Customer 元素的 XML 文档,如下面的示例所示。
<Customer>Kim Abercrombie</Customer>
<Customer>Margaret Smith</Customer>
</CustomerList>
另一个在 SQL Server 2005 中引入的与 XML 相关的显著功能是支持 XML 索引。为了增强 XML 的查询功能,可以为类型 xml 列创建主 XML 索引和辅助XML 索引。主 XML 索引是 XML 实例中所有节点的细化表示,查询处理器可以使用它快速查找XML 值中的节点。创建主 XML 索引后,可以创建辅助 XML 索引改善特定查询类型的性能。下面的例子就是创建主 XML 索引和类型 PATH 的辅助 XML 索引,这可以改善使用 XPath 表达式识别 XML 实例中节点的查询性能。
ON SalesOrders (Notes)
GO
CREATE XML INDEX idx_xml_Path_Notes
ON SalesOrders (Notes)
USING XML INDEX idx_xml_Notes
FOR PATH
GO
SQL Server 2008 中的 XML 功能
在 SQL Server 2000 和 SQL Server 2005 中引入的 XML 功能,在 SQL Server 2008 中得到了进一步增强。SQL Server 2008 中与XML相关的主要增强功能包括:
改进了架构验证功能
增强了对 XQuery 的支持
增强了执行 XML 数据操作语言 (DML) 插入的功能
本文的其余内容将详细介绍这些增强功能,并演示如何使用它们在 SQL Server 2008 中实施更好的 XML 解决方案。