Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167425
  • 博文数量: 103
  • 博客积分: 2251
  • 博客等级: 大尉
  • 技术积分: 1095
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-03 11:15
文章分类

全部博文(103)

文章存档

2011年(103)

分类: 数据库开发技术

2011-05-04 23:06:47

SQLServer2005中对的处理功能显然增强了很多,提供了query(),value(),exist(),modify(),nodes()等函数。

关于xml,难以理解的不是SQLServer提供的函数,而是对xml本身的理解,看似很简单的文件格式,处理起来却是非常困难的。本文只是初探一下而已。

详见SQLServer联机帮助:

主题

说明

此方法用于对XML实例进行查询。

此方法用于从XML实例检索类型的值。

此方法用于确定查询是否返回非空结果。

此方法用于指定语句以执行更新。

此方法用于将XML拆分成多行以将XML文档的组成部分传播到行集中。

 

闲话少说,首先创建一个包含xml类型的数据表,其次创建一个xml文件,在服务端把xml文件内容加载该数据表中。

CREATE TABLE VisioXML

(

 ID INT,

 Doc XML

);

GO

创建一个名为xxx.xml的文件,内容如下

/*

 

   1

   WBQ

 

 

   2

   CZH

 

*/

INSERT INTO VisioXML(ID,Doc)

SELECT 4,* FROM OPENROWSET(BULK 'e:\xxx.xml',SINGLE_BLOB) AS x;

 

--以下为value()query()的用法

--SELECT * FROM VisioXML WHERE ID=4

SELECT

 Doc.value('(/ROOT/ROW[1]/ID/text())[1]','int') RootRowID1, --第一行ID的值,并且转换为int类型

 Doc.value('(/ROOT/ROW[2]/ID/text())[1]','int') RootRowID2, --第二行ID的值,并且转换为int类型

 Doc.value('(/ROOT/ROW[1]/NAME/text())[1]','varchar(20)') RootRowNAME1, --第一行NAME的值,并且转换为VARCHAR类型

 Doc.value('(/ROOT/ROW[1]/NAME/@***)[1]','varchar(20)') RootRowNAME1***, --第一行NAME***属性的值,并且转换为VARCHAR类型

 Doc.query('/ROOT') Root,            --ROOT下的所有XML内容,类型为XML

 Doc.query('/ROOT/ROW[1]') RootRow1, --ROOT下第一行所有的XML内容,类型为XML

 Doc.query('/ROOT/ROW[2]') RootRow2  --ROOT下第二行所有的XML内容,类型为XML

 FROM VisioXML

 WHERE ID=4

 

--以下为exist()函数在两种环境下的用法

SELECT

 Doc.exist('/ROOT/ROW[1]/NAME[(@*** cast as xs:string?) = xs:string("MALE")]') Row1EQStringMale,

 Doc.exist('/ROOT/ROW[1]/NAME[(@*** cast as xs:string?) = "MALE"]') Row1EQMale,

 Doc.exist('/ROOT/ROW[1]/ID[(text()[1] cast as xs:float?) = xs:float(1)]') Row1EQfloat1,

 Doc.exist('/ROOT/ROW[2]/ID[(text()[1] cast as xs:float?) = 2]') Row1EQ1

 FROM VisioXML

 WHERE ID=4

 

SELECT ID,Doc

 FROM VisioXML

 WHERE ID=4

  AND Doc.exist('/ROOT/ROW[1]/NAME[(@***)]')=1     --第一行NAME中存在***属性

  --AND Doc.exist('/ROOT/ROW[1]/NAME[not(@***)]')=1 --第一行NAME中不存在***属性

  --AND Doc.exist('/ROOT/ROW[1][not(ID/*)]')=1     --第一行不存在ID字段

  --AND Doc.exist('/ROOT/ROW[1][(ID/*)]')=1        --第一行存在ID字段

 

阅读(244) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~