xml数据以其灵活的数据储存方式受到广大开发人员喜爱。在sqlserver2005中存在xml数据类型。我们可以使用这样的语句对xml数据进行操作

首先定义一段xml 数据:

代码

declare @xmldata xml 
set @xmldata = ' 
<bookstore> 
<book category="COOKING"> 
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book> 
<book category="

select @xmldata.value('bookstore[1]/book[@category="CHILDREN"][1]/title[1]/@lang','varchar(2)')

"> 
  <title lang="jp">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book> 
<book category="WEB"> 
  <title lang="en">XQuery Kick Start</title> 
  <author>James McGovern</author> 
  <author>Per Bothner</author> 
  <author>Kurt Cagle</author> 
  <author>James Linn</author> 
  <author>Vaidyanathan Nagarajan</author> 
  <year>2003</year> 
  <price>49.99</price> 
</book> 
<book category="WEB"> 
  <title lang="cn">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book> 
</bookstore>

1、查询:@xml . query(xpath) xpath 是匹配方式字符串。必须是完整的,非拼接而成的字符串。'.' 代表本身 '/'代表子节点 '//'代表后代 '*'代表任何

  查询bookstore下所有属性category="WEB"的book节点 :

  

select @xmldata . query ('./bookstore/book[@category="WEB"]')

查询最后1个book 节点:

  

select @xmldata . query ('./bookstore/book[last()]')

    中括号中可以是数字,表示第几个节点。注意:这里的数字1表示第一个节点,尔非0表示第一个。也可以是这样:[position()<=2] 表示前2个节点

  查询所有存在lang属性的节点:(查询所有后代节点中包含属性lang的节点)

  

select @xmldata . query ('//*[@lang]')

    同时,查询可以包含条件:  查询所有price节点值大于30的price节点

select @xmldata . query ('//price[text() > 30]')

    或则更复杂的条件: 查询所有的book节点,条件是其子节点的title节点的lang属性值为"en" 并且 year节点的值为"2003"

select @xmldata . query ('//book[./title[@lang="en"] and ./year[text() = "2003"]]')

有时查询字符串可能包含一些参数:如下代码:我们可能期望通过这样的语句查询所有属性category="WEB"的book节点

declare @parm varchar(3)
set @parm = "WEB"
select @xmldata . query ('//book[@category = "'+@parm+'"]')

但是,这样是错误的。会返回这样的错误:xml 数据类型方法 "query" 的参数 1 必须是字符串文字。

通过:sql:variable("@parm")就能解决这样的问题:

select @xmldata . query ('//book[@category = sql:variable("@parm")]')

另外还存在这样的查询方式:

select @xmldata . query ('for $b in bookstore/book where $b/year[text() = "2003"] return ($b)')
select @xmldata . query ('for $b in bookstore/book where $b/author order by $b/price[1] descending return ($b)')

注意:第二行代码 order by 语句后必须是精确的列,所以要使用[1]。如若不然,如果$b下存在多个price节点,这样的查询则不是我们所需要的

  除 @xml . query(xpath) 方法外还存在

       . exist(xpath) 方法 :

         返回0或1,表示xpath所选择的内容是否存在

         . value(xpath,type):

        返回xpath所选择内容的值,在这里需要制定返回值的类型

为了使XML查询更加高效,我们可以在XML数据上创建索引,具体方法暂不记录。

2、修改:@xml . modify(insert) | .modify(replace) | .modify(delete)

  将一段xml片段插入到制定节点后(前)after | before

set @xmldata . modify('insert <test>Hello</test> after (//book)[last()]')

修改掉price="39.95"的price节点的值为"50.00"

set @xmldata . modify('replace value of (/bookstore/book/price[text()="39.95"]/text())[1] with "50.00"')

删除所有test节点

set @xmldata . modify('delete //test')

  添加属性:

set @xmldata .modify ('insert attribute testatt{"50"} into (/bookstore/book)[1]')

  修改属性:

set @xmldata .modify('replace value of (/bookstore/book/@testatt)[1] with "80"')

转载于:https://www.cnblogs.com/GuoPeng/archive/2009/12/11/1621527.html

SQL 中操作XML类型数据相关推荐

  1. 【转载】 详细介绍Flex中操作XML

    一  在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为"元素"     节点:把XML元素与文本结合起来统称为节 ...

  2. 如何在SQL中处理层次型数据

    最近在做公司的认证系统,看了开源项目如apache shiro跟spring security,还不知道是自己构建还是用上述代码.最近的考虑点是如何处理层次型数据,因为打算给user构造一个有层次的g ...

  3. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  4. Java中操作Xml使用备忘

    List item 文章目录 Java中操作Xml使用备忘 1. Hutool中XmlUtil的使用简介 2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用] 2 ...

  5. 数据库中操作XML(openXML)

    最近公司项目需要在数据库中操作XML,因此系统的学习了一下 一.openxml的格式 OPENXML( idoc int [ in] , XPathnvarchar [ in ] , [ flags ...

  6. VC++中操作XML(MFC、SDK)

    VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作 ...

  7. Mysql在sql中截取时间类型字段的年月日和时间-DATE_FORMAT() 函数

    Mysql在sql中截取时间类型字段的年月日和时间 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式.我们使用 N ...

  8. 系统性详解Redis操作Hash类型数据(带源码分析及测试结果)

    1 缘起 系统讲解Redis的Hash类型CURD, 帮助学习者系统且准确学习Hash数据操作, 逐步养成测试的好习惯, 本文较长,Hash的操作比较多,请耐心看, 既可以集中时间看,亦可以碎片时间学 ...

  9. C#.Net中操作XML方法一

    我们知道XML是一种可标记性的语言,用来标记数据.定义数据类型,是一种运行用户对自己的标记语言进行定义的源语言.因为结构好,并且容易理解,就好比一棵树,层次关系分明,因此也常常把一些数据存储到XML文 ...

最新文章

  1. 欧几里德结构数据与 非欧几里德结构数据
  2. 修改BeEF工具默认密码
  3. 如何使用卡巴斯基急救盘清理感染的PC
  4. Visual Studio的Web Performance Test提取规则详解(1)
  5. Cookie操作以及如何在js中调用jsp变量
  6. mysql事务管理(重)
  7. linux下pcap文件解析头文件,在Linux下操作pcap文件的各种方法整理
  8. 电力系统稳定与控制_风电场柔性直流系统组网型控制关键技术
  9. 企业级Web报表工具告诉你财务要做哪些数据分析
  10. 计算机组成原理SRop,【9A文】计算机组成原理历年真题.docx
  11. kali清理_linux下清理系统垃圾
  12. 完全免费:鲜为人知的桌面正文内容检索工具(支持epub/mobi/azw3/markdown)
  13. 如何在 R 中计算 Eta 平方
  14. Vijos 1055 奶牛浴场 最大子矩阵 算♂法①
  15. Javascript-基础-学习笔记
  16. 穆利堂[推荐] WxPM信息化整体解决方案-河南郑州房地产工程项目管理系统软件 穆穆-movno1
  17. BigDecimal 科学计数法转换 正负数转换
  18. HTB----Heist(Hard)
  19. 华为云计算机总裁,华为消费者业务 CEO余承东兼任华为云与计算 BG 总裁
  20. wow服务器维护8月14,8月14日服务器例行维护公告(已完成)

热门文章

  1. KubeEdge temperature 部署
  2. cannot instantiate the type
  3. python barrier_Python多线程-Barrier(障碍对象)
  4. 【Clickhouse】CLICKHOUSE SQL文件等常用语句
  5. 【Kafka】GroupCoordinatorNotAvailableException - The coordinator is not available
  6. 【Elasticsearch】了解Elasticsearch写入磁盘的数据
  7. 07-windows下Elasticsearch安装-elasticsearch-service服务
  8. spark学习-37-Spark的SortShuffleManager
  9. catia保存成stp文件时部件丢失_电脑硬盘恢复教程,简单复原硬盘丢失数据的做法...
  10. 综保参数如何设定_FANUC主轴速度怎么去设定限制?