我们经常在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. dom 操作

    1.dom 的查找 (1)根据id 查找 var object = document.getElementById("id 值"): (2)根据 name 查找:返回 dom 对象 ...

  2. 再次思考 classpath 环境变量 等

    f:\aspectj1.8\lib\aspectjrt.jar;.;%JAVA_HOME%\lib;C:\Temp\IBM\SQLLIB\java\db2java.zip;C:\Temp\IBM\SQ ...

  3. Laravel 5.3 登录注册底层实现详解

          每个控制器都使用 trait 来引入它们需要的方法 */ 用于处理用户登录认证 用于处理新用户注册 包含重置密码逻辑 用于处理重置密码邮件链接   认证需要的视图 包含了应用的基础布局文件 ...

  4. 阿里云服务器的坑=====部署EF+MVC

    异常处理汇总 ~ 修正果带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4599258.html 先参考:http://www.cnblogs.com/dun ...

  5. 【.net 深呼吸】聊聊WCF服务返回XML或JSON格式数据

    有时候,为了让数据可以“跨国经营”,尤其是HTTP Web有关的东东,会将数据内容以 XML 或 JSON 的格式返回,这样一来,不管客户端平台是四大文明古国,还是处于蒙昧时代的原始部落,都可以使用这 ...

  6. Dreamweaver 扩展开发:文档路径等信息的处理

    //browseFile(fieldToStoreURL){ //getFullPath(filePathURL){ //getSimpleFileName() { //fixUpPath(docUR ...

  7. -Android -线程池 批量上传图片 -附php接收代码

    (出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...

  8. Vertica集群单节点宕机恢复方法

    Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...

  9. 【MVVM DEV】DataColumn中的TextBox与ComboBox的并存

    一.前言       在WPF编程中,有时候我们使用DataGrid会需要在一个DataColumn中既有TextBox,也要有ComboBox或者TextBlock等其他数据显示样式. 这个时候我们 ...

  10. 【C#】无损转换Image为Icon

    如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle); //通过句柄得到图标 此法的问题 ...