SQL Server2005对XML的支持

在SQL Server 2005中,XML被紧密整合进数据库系统中,很多对XML支持的新特性被添加进来,这使得针对XML的数据库开发成为一个新的热点,这不禁使我们要问,这些对XML的支持能够做什么呢?在回答这些问题之前,请看下如下场景:

场景一:有多个系统:ERP系统、人力资源系统、CRM系统等等,其中各个系统之间需要交换一些数据,为了使系统的耦合性降低,确定采用XML来作为交换的格式,但是,由于每一个XML都涉及到多个表,且表内部和表之间有复杂的关系(比如:表内部的父子引用,表之间的主外键关系等),要生成这样的XML工作量不小。
场景二:上一个场景中,CRM系统需要读取人力资源系统的提供的XML数据,并且需要把这些数据插入到多个相关的表中,这些功能究竟如何能够轻松实现?
场景三:系统中有一个产品表,在添加了n个字段(比如:输入电压,输出电压,额定功率等)以后,客户仍然告诉你,还要添加一些字段,而且产品表和其中部分字段的关系是一对多的关系,而这个时候你已苦不堪言。
场景四:上一个场景中,这时你可能还有一个需求,你需要生成产品的报表,我们需要把产品表中的部分普通列和XML数据类型中的部分内容一起显示到报表中,这又如何来做呢?

场景分析:
场景一
大家都知道,XML已经成为异构系统之间数据交换的首要选择,它的好处在于平台独立性,而且数据自描述,表现力强。从技术上看,把关系型数据变成XML难度并不大,但是工作量巨大。比如:很多ORMapping方案中都有一个XML文件来把表结构(一般存在系统表中)映射到对象的属性上,这个转换的工作量就不小,如果层次结构更加复杂,工作量就更大了。

场景二
和上面的情况相同,如果把XML作为数据交换的格式,那么如何把它存进关系型的系统中呢,要知道根据规则一个XML可能需要插入到好几个表中,这个工作如果用程序来做,想一想也觉得麻烦.

场景三
从原理上说,数据库的实体关系模型适合处理结构化的数据。而对于半结构,或无固定结构的数据则不太适合,在本场景中,用户要求添加的数据就属于半结构化的数据,它的特点是基本结构稳定,但一些细节经常变化。这种数据采用XML来存储是非常合适的,而且,由于这些XML和关系型数据精密相关,所以最好的方法是把它存储到数据库中。

场景四
这个场景的特点是:XML数据和关系型数据混合输出,混合输出的格式可能是关系型的,也可能是XML格式。在实际的业务中,这种需求也司空见惯。

归纳起来,要满足以上四个场景的要求,SQL Server2005的需要解决:
1.如何把关系型数据转化成XML?
2.如何把XML转化成关系型数据?
3.如何把XML直接存储到关系数据库中,并对其作相关的修改,查询?
4.如何把XML和关系型数据混合输出,输出的格式可以是关系型也可以是XML? 

解决之道
1.使用For XML把关系型数据转化成XML?
比如:
SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID,
OrderHeader.Status, Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID FOR XML AUTO

详细的用法:http://msdn2.microsoft.com/zh-cn/library/ms178107.aspx

2.使用Openxml把XML转化成关系型数据?
比如:
DECLARE @DocHandle int
DECLARE @XmlDocument nvarchar(1000)
SET @XmlDocument = N'<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
          OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
          OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XmlDocument
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@DocHandle, '/ROOT/Customer',1)
      WITH (CustomerID  varchar(10),
            ContactName varchar(20))
EXEC sp_xml_removedocument @DocHandle

详细的见:http://msdn2.microsoft.com/zh-cn/library/ms187897.aspx

3.使用XML 数据类型把XML直接存储到数据库中,使用功能异常强大XQuery (query,modify, delete等方法)对XML数据作相关的修改,查询。而且SQL Server2005中增加了对XML数据类型的索引,这使得对XML数据的查询性能大大提高。
比如:
DECLARE @x xml
SET @x = '<ROOT><a>111</a></ROOT>'
SELECT @x.query('/ROOT/a')

详细的见:http://msdn2.microsoft.com/zh-cn/library/ms189075.aspx

4.混合For XML、把XML和关系型数据混合输出,输出的格式可以是关系型也可以是XML? 
XQuery语句中,我们可以嵌入:sql:column(), sql:variable()函数,前一个函数表中的列,后一个函数表示SQL变量。比如:
DECLARE @price money
SET @price=2500.00
DECLARE @x xml
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('
declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

       <Product
           ProductID="{ sql:column("Production.Product.ProductID") }"
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"
           ListPrice="{ sql:column("Production.Product.ListPrice") }"
           DiscountPrice="{ sql:variable("@price") }"
        />')
FROM Production.Product, Production.ProductModel
WHERE Production.Product.ProductModelID = Production.ProductModel.ProductModelID
AND ProductID=771
SELECT @x

这两个函数再加上前面三个技术,在SQL Server2005中XML和关系数据便融合了起来。

总结
通过诸多新增的技术,SQL Server2005中XML和关系数据紧密融合,这使得我们在数据建模(在XML数据和关系数据之间的一种权衡)和XML应用的时候多了一种新的选择。

posted on 2006-10-25 17:28  microsheen  阅读(1464)  评论(0编辑  收藏  举报