目前,很多开发人员都将SQL Server 2005作为应用程序数据库。这其中的原因是多方面的,例如开发习惯、功能强大、易于上手、对于既有开发技术的支持等。为了帮助广大读者熟悉SQL Server 2005,本文重点对SQL Server 2005提供的新XML功能进行讲解。在讲解之前,首先了解有关的基本概念。
由于SQL Server 2000是在服务器中利用BLOB字段存储XML文本,所以不能以原格式真正使用或者引用服务器中的XML。为了使用SQL Server 2000中的XML,必须将XML抽取到应用程序层,然后使用XML语法分析程序或者文档对象模型来使用数据。
SQL Server 2005的XML数据类型避免了这种限制,因为该类型被实现为最好原数据类型。新的数据类型可使SQL Server如同理解整型或者字符串数据那样相同的方式理解XML数据。使用XML数据类型可创建仅存储XML,或者存储XML和关系型数据的表。这种灵活性使得开发人员对结构化数据使用关系型模型,同时利用XML的半结构化数据增强该数据。当以XML数据类型列存储XML值时,有两种选择:一种是使用类型化列,在这种类型列中存储的XML数据使用XML架构集合来确保有效性。另一种是非类型化列:在这种类型列中,只要XML数据格式良好,则能够插入任何类型的XML数据。
为帮助开发人员最有效的结合半结构化和关系型数据,SQL Server 2005的XML数据类型支持多个实现查询和修改XML数据的内建方法。这些方法可接受XQuery,它是新兴的W3C标准语言,同时还包括XPath 2.0。开发人员可以将对于XML数据类型方法的查询调用与创建查询,返回关系型和XML数据的标准T-SQL一起使用。
除了XML数据类型以外,FOR XML和OpenXML功能在SQL Server 2005中也得到了扩展。这些功能共同支持XQuery,这样SQL Server 2005就能够通过一个功能强大的平台来实现利用半结构化数据开发富应用程序,以及非结构化数据的管理。使用所有这些添加的功能,开发人员对于数据存储和应用程序开发则有了更多的选择。下面首先介绍SQL Server 2005中的FOR XML功能。
1、SQL Server 2005中的FOR XML功能
SQL Server 2000为SELECT语句引入了FOR XML子句。FOR XML子句能够将SELECT语句返回的关系型行集合聚合为XML数据。如下所示,服务器中的FOR XML支持三种模式,这些模式提供了不同的转换方式:
RAW:RAW模式为每行都生成名为row的单个元素。
SELECT (SELECT * FROM HumanResources.Employee as Employee FOR XML AUTO, TYPE).query( '') 上面的查询将生成如下输出:
一旦创建CustomerSchema,那么就可以轻松的将其与Customer表的XmlData列关联起来,语法如下:
CREATE TABLE Customer(ID int primary key, XmlData XML(CustomerSchema))
当将值插入Customer表中,XmlData列中的XML数据将根据CustomerSchema进行验证:
Insert into Customer values(1, '
在将架构与XML列关联时,开发人员可以使用DOCUMENT或者CONTENT标志来设置是否能够在类型化列中存储XML树或者片段。对于DOCUMENT而言,每个XML实例都会根据用来对其进行验证和类型化的命名控件,设置实例中顶级元素的目标命名空间。另一方面,对于CONTENT而言,每个顶级元素都能够在架构集合中设置任一目标命名空间。在生成实例过程中,将根据目标命名空间验证XML实例。例如,开发人员可执行以下包括无效命名空间声明的SQL语句:
Insert into Customer values(3, '
由于Insert语句中包括无效的命名空间,所以应该看到类似如下的错误消息:
Msg 6913, Level 16, State 1, Line 1 XML Validation: Declaration not found for element 'http://invalidnamespace/books:customer'. Location: /*:customer[1]
3.4 将数据插入XML数据类型列
无论XML列是类型化还是非类型化,开发人员都可采用以下方式为XML列提供值:(1)作为可隐式转换为XML数据类型的字符或者二进制SQL类型;(2)作为文件内容;(3)作为可生成XML数据类型实例的,包括TYPE指令的FOR XML语句输出。
提供的值必须经过格式良好的验证,这样才能存储XML文档和XML片段。假如数据未通过格式良好验证,那么将显示适当的错误消息来拒绝。对于类型化XML,检测提供的值是为了XML架构集合中XML架构测定XML列的一致性要求。假如验证失败,则拒绝XML实例。下面查看一下将值插入XML列中不同方法的示例:
首先,以下语句将整数列ID的值2和XmlData列的
INSERT INTO Customer values (2, '
正如前文提到的,对于Insert命令,还可能利用XML文件内容作为输入。以下XML文档存储在名为Customer.xml文件中:
INSERT INTO Customer SELECT 7, xml_value FROM (SELECT * FROM OPENROWSET (BULK 'C:DataCustomer.xml', SINGLE_BLOB) AS xml_value) AS R(xml_value)
对于Insert命令而言,第三种方式是利用包括TYPE指令的FOR XML的输出作为输入。在SQL Server 2005中,使用包括TYPE指令的FOR XML能够将结果生成为XML数据类型实例。XML结果能够赋值给XML列,变量或者参数。在以下语句中,使用FOR XML TYPE将生成的XML实例赋值给XML数据类型变量@var。然后,在INSERT语句中使用该变量:
DECLARE @var xml SET @var = (SELECT XmlData FROM Customer FOR XML AUTO,TYPE) -- 将变量值插入新表CustomerOutput中 CREATE TABLE CustomerOutput (XmlData xml) INSERT INTO CustomerOutput (XmlData) VALUES (@var)
3.5 XML数据类型方法
虽然XML数据类型是内置数据类型,但是通过提供一些查询和更新存储在XML变量或者列中数据的方法,它的功能类似于用户定义数据类型(UDT)。开发人员可使用这些方法查询,获取标量值,以及修改存储在变量,列或者参数中的XML文档。下表列举了XML数据类型方法 。

4、小结
由于XML在计算机世界中是一种无孔不入的语言,所以SQL Server 2005和ADO.NET对XML提供功能丰富的内置支持是合乎逻辑的。本文展示了SQL Server 2005的XML功能。假如正确使用,那么这些XML功能可为整个架构带来有意义的变化。