关于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字段

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值