SQL Server 2005 中的XML数据类型

来源:互联网 发布:猴博士爱讲课知乎 编辑:程序博客网 时间:2024/05/16 08:49

在SQL Server 2005中,对XML的支持得到了很好的加强。最重要的一点就是,微软在SQL Server 2005中提供了一个新的数据类型,即XML数据类型,从此告别了用关系型数据来模拟XML数据的历史。之后XML数据就可以直接保存到数据表的一个字段中。

XML数据类型是一专门于保存和操作XML的数据类型。它是以BLOB的二进制形式保存的,一个XML类型字段可以保存2GB的XML代码,层次可达 128层。此外,XML数据类型还有检验XML数据完整性的功能,比以前用text类型保存XML数据方便得多。

例如,下列代码在school数据库中创建了一个数据表books,此数据表中包含一个带有XML类型的字段xmlCol,并插入了一条记录。

 USE school  CREATE TABLE books (id INT PRIMARY KEY,xmlCol XML NOT NULL)   GO  INSERT INTO books VALUES (1, '<book type="computer" publicationdate="2008"   ISBN="0-7356-1588-2">  <title>c#</title>  <author>  <first-name>sheng</first-name>  <last-name>bin</last-name>  </author>  <author>  <first-name>gengxin</first-name>  <last-name>sun</last-name>  </author>  <price>35.99</price>  </book>') 

在第2行中使用CREATE TABLE命令创建一个数据表,其中第2个字段是XML类型的。在第4行的INSERT语句中对应该字段的是一个XML文档。
通过上述代码可以看出,使用 SQL Server 2005 中的新 XML数据类型xmlCol,可以很方便地向数据表中插入XML文档数据。
SQL Server 2005 中的新 XML数据类型还具有以下功能。
● 创建既包含普通关系列,又包含有XML类型列的表。
● 通过与XML集合关联,创建有类型的XML列类型。
● 对涉及其他XML或非XML类型列的XML列进行限制。
● 创建可用于存储XML数据类型实例的XML类型的变量。
● 为存储过程或用户定义的函数创建XML类型的参数。
● 从用户定义的函数中返回XML类型值。
● 运行XQuery子集,在XML结构内查询并转换XML数据。
● 根据XML类型的列创建计算列。
● 为XML类型的列创建XML索引,以提高查询性能。
● 使用XML DML对XML实例进行元素级的插入、删除和更新操作。
● 将XML类型数据的实例传递到sp_xml_preparedocument,为XML文档在内存中的表示作准备。
● 使用XQuery和XML DML编写包含关系和XML列的跨域查询。
● 使用CAST和CONVERT,分别将XML类型转换为varchar和nvarchar类型。
● 使用CAST或CONVERT,将字符串数据类型(如varchar、text、varbinary 和image)转换为XML类型。
XML类型还提供了5个用于查找和更新的方法,分别是query、exist、value、nodes和modify方法。调用这5个方法时必须全部小写,而且全部都使用XQuery语句来定位,用来定位的XQuery语句将以字符串的形式作为方法的第一个参数。
注意:
XQuery 是用于 XML数据查询的语言;其对 XML 的作用类似 SQL 对数据库的作用;XQuery 被构建在XPath 表达式之上,并由所有主要的数据库引擎支持(IBM、Oracle、Microsoft等);XQuery 是 W3C 标准。XQuery 1.0 和 XPath 2.0 共享相同的数据模型,并支持相同的函数和运算符。
下面详细介绍XML类型提供的这5个用于查找和更新的方法。
1) query方法
可以提取 XML文档的片段,该方法接受 XQuery 表达式作为参数,并返回无类型的XML实例。例如,在查询窗口中输入以下代码:
DECLARE @x xml  SET @x = '<ROOT><teacher_name>betty</teacher_name></ROOT>' SELECT @x.query('/ROOT/teacher_name') 

结果中显示的XML文档的片段是ROOT元素下的teacher_name元素及其内容。

2) value方法
该方法通过指定XQuery表达式以及需要返回的SQL 类型,可以从 XML实例中提取标量值。由于value方法只能返回一个值,因此它执行的XQuery语句必须要能确定到一个值上,否则就会报错。例如,在查询窗口中输入以下代码:

SELECT xmlCol.value('(/book/author)[2]', 'nvarchar(max)') FROM books 

结果中显示的是xmlCol列中book元素中的第二个author子元素中的内容。

3) exist方法
该方法用于确定 XML 实例中是否存在某一元素,如果存在则返回1,否则返回0。例如,在查询窗口中输入以下代码:
SELECT xmlCol.exist('/book/title') FROM books 

执行结果将返回1,因为xmlCol列中,book元素中存在名为title的子元素。

4) nodes方法
该方法用于从XML实例片断产生一个新的XML实例。nodes方法和query方法的区别在于,query方法返回的XML片断是作为字符串返回的,而nodes返回的XML片断则是XML类型的,然后程序还可以对这个返回的XML类型进行进一步的操作。nodes的使用比较复杂,往往要与CROSS APPLY连用。例如,在查询窗口中输入以下代码:
SELECT nref.query('.') LastName  FROM books CROSS APPLY xmlCol.nodes('//first-name') AS R(nref) 

5) modify方法

该方法可以对 XML数据进行更新。通过XQuery中添加的insert、delete和update关键字提供了对XML DML的支持,使用 insert、delete和update关键字可以分别插入、删除和更新一个或多个节点。例如,在查询窗口中输入以下代码:

 UPDATE books SET xmlCol.modify(  'insert <section num="1">  <content>Background</content>  </section>  after (/book/title)[1]')  where id = 1  

在该段代码的第1行使用UPDATE语句修改books表中xmlCol类型的字段,在第2~7行使用insert

<book type="computer" publicationdate="2008" ISBN="0-7356-1588-2">  <title>c#</title>  <author>  <first-name>sheng</first-name>  <last-name>bin</last-name>  </author>  <author>  <first-name>gengxin</first-name>  <last-name>sun</last-name>  </author>  <price>35.99</price>  </book> 

执行此段代码后,在id列值为1的记录的xmlCol列中添加元素section,此元素将添加在title元素的下面。更改后的xmlCol列的内容将如下所示。

<book type="computer" publicationdate="2008" ISBN="0-7356-1588-2">  <title>c#</title>  <section num="1">  <content>Background</content>  </section>  <author>  <first-name>sheng</first-name>  <last-name>bin</last-name>  </author>  <author>  <first-name>gengxin</first-name>  <last-name>sun</last-name>  </author>  <price>35.99</price>  </book> 
通过上述的讲解可以看出,XML数据类型提供了一种在服务器上存储 XML数据的简单直观的方法,同时还保留了文档顺序和文档结构。这一点特别适用于文档顺序和文档结构非常重要的文档。另外,XML数据类型还能够对XML数据进行深入的查询和修改操作。在SQL Server 2005 之前,没有办法在数据库内部存储XML。因此,如果要修改或查询XML数据,必须从 nvarchar或text 列中加载数据,由字符串创建XML文档,然后才能进行修改。将修改过的数据写回数据库的步骤与此类似。而现在使用XML数据类型,这些步骤就变得非常简单。由于 XML 类型的数据存储在数据库中,它还具有很多数据库的功能,如备份和恢复、SQL Server 安全性、事务、日志等。因此,将XML文档存储为 XML数据类型非常适用于以下情况。
● 应用程序需要保留XML文档的信息集内容。
● 应用程序需要对XML文档进行元素级的修改和查询操作。
● 应用程序需要创建XML数据类型列的索引,以加快查询处理。
● 应用程序使用各种不同结构的XML文档。
但要注意的是,使用新的XML数据类型时也存在如下限制。
● 不能存储精确的数据副本。
● XML文档的层次最多为128层。
● XML文档的内部二进制表示最大为2GB。
● XML列不能成为主键约束或外键约束的一部分。
● XML列不能作为分组值在group by语句中使用。
● XML不能转换为 text、ntext或image数据类型。




0 0
原创粉丝点击