T-SQL 查询XML
我们经常在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 实现的。
- 获取所有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'
- 将各个节点转换为关系数据库表结构
查询语句为
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的更多相关文章
- sql查询XML
--查询Extra里节点UName值等于“黄”的所有信息 select * from t_UserPayLog where Extra.exist('//UName[.="黄"]' ...
- SQL Server XML 查询
[参考1] 18个小实例入门SQLServer XML查询 [参考2] 转载---SQL Server XML基础学习之<5>--XQuery(query)
- Sql Server xml 类型字段的增删改查
1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需 ...
- Hibernated的sql查询
记录一下学习Hibernate的心得 1.为什么HIbernate会支持原生态的sql查询? HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中, ...
- 15个初学者必看的基础SQL查询语句
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...
- hibernate将本地SQL查询结果封装成对象
hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...
- SQL查询性能分析
http://blog.csdn.net/dba_huangzj/article/details/8300784 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Serv ...
- SQL SERVER XML 学习总结
SQL SERVER XML 学习总结 最新的项目任务要做一个数据同步的功能,这些天都在做技术准备,主要是用到了微软的Service Broker技术,在熟悉使用该技术的同时,又用到了Sql s ...
- 转载---SQL Server XML基础学习之<6>--XQuery的 value() 方法、 exist() 方法 和 nodes() 方法
/*------------------------------------------------------------------------------+ #| = : = : = : = : ...
- 转载---SQL Server XML基础学习之<5>--XQuery(query)
本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPa ...
随机推荐
- JavaScript继承的模拟实现
我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承.我们也只能通过在原对象里添加或改写属性来模拟实现. 先定义一个父类 ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试
此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- vue vue-cli安装
npm 更新 cnpm install -g npm Vue 的基本用法 Vue 相比于 React 和 Angular 容易上手多了,因此我对 Vue 的学习主要以文档为主,视频为辅(只有像我这种菜 ...
- mongodb全套配置
1,下载&安装 MongoDB 提供了centos yum安装方式. 参考:http://docs.mongodb.org/manual/tutorial/install-mongodb-on ...
- ASP.NET Core WebListener 服务器
原文地址:WebListener server for ASP.NET Core By Tom Dykstra, Chris Ross WebListener是一个只能运行在Windows上的ASP. ...
- RabbitMQ Config
默认访问地址:http://localhost:15672/ 要想修改内网访问: %APPDATA%\RabbitMQ\ 目录下添加文件 rabbitmq.config [ {rabbit, [%% ...
- 来玩Play框架01 简介
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 说到网络框架,Ruby的Ruby on Rail和Python的Django都相当 ...
- java中如何实现多态
复习基础知识 多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短 ...