ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于SQLServer2005的学习笔记——XML的处理

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

原创 Linux操作系统 作者:bq_wang 时间:2010-03-03 09:07:08 0 删除 编辑
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 

在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的文件,内容如下

/*

 

    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/@SEX)[1]','varchar(20)') RootRowNAME1SEX, --第一行NAME中SEX属性的值,并且转换为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字段

 

 

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/6517/viewspace-628451/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    445
  • 访问量
    1209429