微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于SQLServer2005的学习笔记——XML的处理

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

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

详见sqlServer联机帮助:

主题

说明

query()方法(xml数据类型)

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

value()方法(xml数据类型)

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

exist()方法(xml数据类型)

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

modify()方法(xml数据类型)

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

nodes()方法(xml数据类型)

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

 

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

CREATE TABLE VisioXML

(

 ID INT,

 Doc XML

);

GO

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

/*

<ROOT>

 <ROW>

   <ID>1</ID>

   <NAME SEX="MALE">WBQ</NAME>

 </ROW>

 <ROW>

   <ID>2</ID>

   <NAME SEX="FEMALE">CZH</NAME>

 </ROW>

</ROOT>

*/

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/@SEX)[1]','varchar(20)') RootRowNAME1SEX,--第一行NAMESEX属性的值,并且转换为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[(@SEX cast as xs:string?) = xs:string("MALE")]') Row1EQStringMale,

 Doc.exist('/ROOT/ROW[1]/NAME[(@SEX 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[(@SEX)]')=1     --第一行NAME中存在SEX属性

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐