我们经常在SQL Server列中存一些XML来作为配置文件或者是保存特殊信息,那么如何将其展开并查询它或将其呈现为关系数据? 其实在T-SQL 下可以很容易的实现。

示例xml

<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
</book>
</catalog>

我们先把xml插入到一个临时表中,只有两个字段ConfigName和ConfigXML

create table #config
(
ConfigName varchar(100),
ConfigXML xml
) insert into #config
select 'TestConfig', '<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer''s Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
</book>
</catalog>'

好的,下面来看一下场景是如何用sql 实现的。

  1. 获取所有xml 中各个book的子xml内容, 这种情况出现在为前台系统提供xml片段。

查询语句为

select r.value('@id','varchar(50)') as bookid,
config.r.query('.') as xmlconfig
from #config
cross apply ConfigXML.nodes('/catalog/book') as config(r)
where ConfigName = 'TestConfig'
  1. 将各个节点转换为关系数据库表结构

查询语句为

select config.r.value('@id', 'varchar(50)') AS BookID,
config.r.value('(author/text())[1]', 'varchar(50)') AS author,
config.r.value('(title/text())[1]', 'varchar(50)') AS title,
config.r.value('(genre/text())[1]', 'varchar(50)') AS genre,
config.r.value('(price/text())[1]', 'varchar(50)') AS price,
config.r.value('(publish_date/text())[1]', 'varchar(50)') AS publish_date
from #config
cross apply ConfigXML.nodes('/catalog/book') as config(r)
where ConfigName = 'TestConfig'

查询 bookid为k101的信息

方式1: 直接在2的结果集中加上一个where条件and config.r.value('@id','varchar(50)') = 'bk101'

select config.r.value('@id', 'varchar(50)') AS BookID,
config.r.value('(author/text())[1]', 'varchar(50)') AS author,
config.r.value('(title/text())[1]', 'varchar(50)') AS title,
config.r.value('(genre/text())[1]', 'varchar(50)') AS genre,
config.r.value('(price/text())[1]', 'varchar(50)') AS price,
config.r.value('(publish_date/text())[1]', 'varchar(50)') AS publish_date
from #config
cross apply ConfigXML.nodes('/catalog/book') as config(r)
where ConfigName = 'TestConfig'
and config.r.value('@id','varchar(50)') = 'bk101'

方式2:修改cross apply的xml path

select config.r.value('@id', 'varchar(50)') AS BookID,
config.r.value('(author/text())[1]', 'varchar(50)') AS author,
config.r.value('(title/text())[1]', 'varchar(50)') AS title,
config.r.value('(genre/text())[1]', 'varchar(50)') AS genre,
config.r.value('(price/text())[1]', 'varchar(50)') AS price,
config.r.value('(publish_date/text())[1]', 'varchar(50)') AS publish_date
from #config
cross apply ConfigXML.nodes('/catalog/book[@id=''bk101'']') as config(r)
where ConfigName = 'TestConfig'

注:如果我们从sql  server参数里面拼接xpath需要添加sql:variable来表示他是一个sql  server变量而不是xml属性名。

declare @bookid varchar(30) = 'bk101'

select config.r.value('@id', 'varchar(50)') AS BookID,
config.r.value('(author/text())[1]', 'varchar(50)') AS author,
config.r.value('(title/text())[1]', 'varchar(50)') AS title,
config.r.value('(genre/text())[1]', 'varchar(50)') AS genre,
config.r.value('(price/text())[1]', 'varchar(50)') AS price,
config.r.value('(publish_date/text())[1]', 'varchar(50)') AS publish_date
from #config
cross apply ConfigXML.nodes('/catalog/book[@id=sql:variable("@bookid")]') as config(r)
where ConfigName = 'TestConfig'

4. 查询每个book  的id和author信息

方式1: 使用第二步结果集

select config.r.value('@id', 'varchar(50)') AS BookID,
config.r.value('(author/text())[1]', 'varchar(50)') AS author
from #config
cross apply ConfigXML.nodes('/catalog/book') as config(r)
where ConfigName = 'TestConfig'

方式2:

select config.r.value('../@id', 'varchar(50)') AS BookID,
config.r.value('.', 'varchar(50)') AS author
from #config
cross apply ConfigXML.nodes('/catalog/book/author') as config(r)
where ConfigName = 'TestConfig'

T-SQL 查询XML的更多相关文章

  1. sql查询XML

    --查询Extra里节点UName值等于“黄”的所有信息 select * from t_UserPayLog where Extra.exist('//UName[.="黄"]' ...

  2. SQL Server XML 查询

    [参考1] 18个小实例入门SQLServer XML查询 [参考2] 转载---SQL Server XML基础学习之<5>--XQuery(query)

  3. Sql Server xml 类型字段的增删改查

    1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需 ...

  4. Hibernated的sql查询

    记录一下学习Hibernate的心得 1.为什么HIbernate会支持原生态的sql查询? HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中, ...

  5. 15个初学者必看的基础SQL查询语句

    本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...

  6. hibernate将本地SQL查询结果封装成对象

    hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...

  7. SQL查询性能分析

    http://blog.csdn.net/dba_huangzj/article/details/8300784 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Serv ...

  8. SQL SERVER XML 学习总结

    SQL  SERVER  XML  学习总结 最新的项目任务要做一个数据同步的功能,这些天都在做技术准备,主要是用到了微软的Service Broker技术,在熟悉使用该技术的同时,又用到了Sql s ...

  9. 转载---SQL Server XML基础学习之<6>--XQuery的 value() 方法、 exist() 方法 和 nodes() 方法

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...

  10. 转载---SQL Server XML基础学习之<5>--XQuery(query)

    本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPa ...

随机推荐

  1. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  2. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  3. Swift -- 对AFN框架的封装

    Swift -- 对AFN框架的封装 一.封装AFN的目的 简单的说: 解耦 日常工作中,我们一般都不会去直接使用AFNetWorking来直接发送网络请求,因为耦合性太强,假设有多个控制器都使用AF ...

  4. 修改linux的hosts 后提示“无效的参数”

    碰到个问题,修改linux的主机名问题. vim /etc/hosts 192.168.154.129 129192.168.154.132 132192.168.154.133 133 本地ip是1 ...

  5. 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式

    我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...

  6. 细说Promise

    一.前言 JavaScript是单线程的,固,一次只能执行一个任务,当有一个任务耗时很长时,后面的任务就必须等待.那么,有什么办法,可以解决这类问题呢?(抛开WebWorker不谈),那就是让代码异步 ...

  7. 【CSS进阶】CSS 颜色体系详解

    说到 CSS 颜色,相比大家都不会陌生,本文是我个人对 CSS 颜色体系的一个系统总结与学习,分享给大家. 先用一张图直观的感受一下与 CSS 颜色相关大概覆盖了哪些内容. 接下来的行文内容大概会按照 ...

  8. webService学习之路(二):springMVC集成CXF快速发布webService

    继上一篇webService入门之后,http://www.cnblogs.com/xiaochangwei/p/4969448.html ,现在我将我周六在家研究的结果公布出来 本次集成是基于之前已 ...

  9. 【补充】Gitlab 部署 CI 持续集成

    上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...

  10. 软件工程的引入:Scrum开发框架总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点如下: 软件工程概念 敏捷开发过程scrum 一.什么是软件工程?请用一句话描述. 软件工程是一门研究性的学科:它用工程化 ...