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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...