SQL Server2005中使用XML-数据类型、查询与修改
SQL 2005引进了XML数据类型,可以直接将XML当作字符串直接存入该列。
这样可以不需要对它进行XML解析。
USE AdventureWorks
-- 创建一个送货排程表
CREATE TABLE Sales.DeliverySchedule
(ScheduleID int IDENTITY PRIMARY KEY,
ScheduleDate DateTime,
DeliveryRoute int,
DeliveryDriver nvarchar(20),
DeliveryList xml)
-- 插入 XML
INSERT INTO Sales.DeliverySchedule
VALUES(GetDate(), 3, 'Alice',
'<?xml version="1.0" ?>
<DeliveryList>
<Delivery SalesOrderID="43659">
<CustomerName>Steve Schmidt</CustomerName>
<Address>6126 North Sixth Street, Rockhampton</Address>
</Delivery>
<Delivery SalesOrderID="43660">
<CustomerName>Tony Lopez</CustomerName>
<Address>6445 Cashew Street, Rockhampton</Address>
</Delivery>
</DeliveryList>')
SELECT * FROM Sales.DeliverySchedule
字段的方法:
value()是取得属性的值、或元素的文本
exist()是判断是否满足某种条件
query()获取子节点本身,返回的就是XML类型的数据
modify()修改- -replace /insert/ delete
modify('replace value of (某节点元素) with "内容"')
node()类似query(),取得子节点,将XML数据转换成表
-- 查询 Delivery 元素
SELECT DeliveryDriver,
DeliveryList.query('/DeliveryList/Delivery') As Deliveries
FROM Sales.DeliverySchedule
-- 查询送货清单中第一个递送的地址,字段名.value( )取的是对应节点的值
--[1]:第一个Address元素
SELECT DeliveryList.value('(/DeliveryList/Delivery/Address)[1]', 'nvarchar(100)') As DeliveryAddress
FROM Sales.DeliverySchedule
WHERE ScheduleID = 1
订单送货的送货员是谁?
SELECT DeliveryDriver
FROM Sales.DeliverySchedule
--DeliveryList代表列名
--exist()代表方法
--@代表属性 (@SalesOrderID=43659 )
代表false
WHERE DeliveryList.exist('/DeliveryList/Delivery[@SalesOrderID=43659]') = 1
-- 更改送货地址
UPDATE Sales.DeliverySchedule
SET DeliveryList.modify
('replace value of (/DeliveryList/Delivery/Address/text())[1]
with "7194 Fourth St. Rockhampton"')
WHERE ScheduleID = 1
可以在XML列上创建XML索引。
/*
sql xml 入门:
--by jinjazz
--http://blog.csdn.net/jinjazz
1、xml: 能认识元素、属性和值
2、xpath: 寻址语言,类似windows目录的查找(没用过dir命令的话就去面壁)
语法格式,这些语法可以组合为条件:
"."
表示自己,
".."
表示父亲,
"/"
表示儿子,
"//"
表示后代,
"name"
表示按名字查找,
"@name"
表示按属性查找
"集合[条件]"
表示根据条件取集合的子集,条件可以是
数 值:数字,
last
(),
last
()-数字 等
布尔值:position()<数字,@
name
=
'条件'
,
name
=
'条件'
条件是布尔值的时候可以合并计算:
and
or
3、xquery: 基于xpath标的准查询语言,sqlserver xquery包含如下函数
exist(xpath条件):返回布尔值表示节点是否存在
query(xpath条件):返回由符合条件的节点组成的新的xml文档
value(xpath条件,数据类型):返回指定的标量值,xpath条件结果必须唯一
nodes(xpath条件): 返回由符合条件的节点组成的一行一列的结果表
*/
declare
@data xml
set
@data=
'
<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="CHILDREN">
<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>
'
--测试语句,如果不理解语法请参考上面的xpath规则和xquery函数说明
--1、文档
select
@data
--2、任意级别是否存在price节点
select
@data.exist(
'//price'
)
--3、获取所有book节点
select
@data.query(
'//book'
)
--4、获取所有包含lang属性的节点
select
@data.query(
'//*[@lang]'
)
--5、获取第一个book节点
select
@data.query(
'//book[1]'
)
--6、获取前两个book节点
select
@data.query(
'//book[position()<=2]'
)
--7、获取最后一个book节点
select
@data.query(
'//book[last()]'
)
--8、获取price>35的所有book节点
select
@data.query(
'//book[price>35]'
)
--9、获取category="WEB"的所有book节点
select
@data.query(
'//book[@category="WEB"]'
)
--10、获取title的lang="en"的所有book节点
select
@data.query(
'//book/title[@lang="en"]'
)
--11、获取title的lang="en"且 price>35的所有book节点
select
@data.query(
'//book[./title[@lang="en"] or price>35 ]'
)
--12、获取title的lang="en"且 price>35的第一book的(第一个)title
select
@data.query(
'//book[./title[@lang="en"] and price>35 ]'
).value(
'(book/title)[1]'
,
'varchar(max)'
)
--13、等价于12
select
@data.value(
'(//book[./title[@lang="en"] and price>35 ]/title)[1]'
,
'varchar(max)'
)
--14、获取title的lang="en"且 price>35的第一book的(第一个)title的lang属性
select
@data.value(
'((//book[@category="WEB" and price>35 ]/title)[1]/@lang)[1]'
,
'varchar(max)'
)
--15、获取第一本书的title
select
Tab.Col.value(
'(book/title)[1]'
,
'varchar(max)'
)
as
title
from
@data.nodes(
'bookstore'
)
as
Tab(Col)
--16、获取每本书的第一个author
select
Tab.Col.value(
'author[1]'
,
'varchar(max)'
)
as
title
from
@data.nodes(
'//book'
)
as
Tab(Col)
--17、获取所有book的所有信息
select
T.C.value(
'title[1]'
,
'varchar(max)'
)
as
title,
T.C.value(
'year[1]'
,
'int'
)
as
year
,
T.C.value(
'title[1]'
,
'varchar(max)'
)
as
title,
T.C.value(
'price[1]'
,
'float'
)
as
price,
T.C.value(
'author[1]'
,
'varchar(max)'
)
as
author1,
T.C.value(
'author[2]'
,
'varchar(max)'
)
as
author2,
T.C.value(
'author[3]'
,
'varchar(max)'
)
as
author3,
T.C.value(
'author[4]'
,
'varchar(max)'
)
as
author4
from
@data.nodes(
'//book'
)
as
T(C)
--18、获取不是日语(lang!="jp")且价格大于35的书的所有信息
select
T.C.value(
'title[1]'
,
'varchar(max)'
)
as
title,
T.C.value(
'year[1]'
,
'int'
)
as
year
,
T.C.value(
'title[1]'
,
'varchar(max)'
)
as
title,
T.C.value(
'price[1]'
,
'float'
)
as
price,
T.C.value(
'author[1]'
,
'varchar(max)'
)
as
author1,
T.C.value(
'author[2]'
,
'varchar(max)'
)
as
author2,
T.C.value(
'author[3]'
,
'varchar(max)'
)
as
author3,
T.C.value(
'author[4]'
,
'varchar(max)'
)
as
author4
from
@data.nodes(
'//book[./title[@lang!="jp"] and price>35 ]'
)
as
T(C)
SQL Server2005中使用XML-数据类型、查询与修改的更多相关文章
- SQL Server中的Image数据类型的操作
原文:SQL Server中的Image数据类型的操作 准备工作,在库Im_Test中建立一张表Im_Info,此表中有两个字段,分别为Pr_Id (INT),Pr_Info (IMAGE),用来存储 ...
- MVC3学习:Sql Server2005中时间类型DateTime的显示
在Sql Server2005中,如果将某字段定义成日期时间类型DateTime,那么在视图中会默认显示成年月日时分秒的方式(如 2013/8/6 13:37:33) 如果只想显示成年月日形式,不要时 ...
- delphi向SQL Server2005中存取图片
SQL Server2005中,我用image类型来存取图片,首先把数据库表设置好 例如我的pic表有如下两列:时间,图片. delphi中,我用ADOQuery来连接数据库,但是数据库中有好几张表, ...
- sql server中对xml进行操作
一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...
- SQL Server 2008 对XML 数据类型操作
原文 http://www.cnblogs.com/qinjian123/p/3240702.html 一.前言 从 SQL Server 2005 开始,就增加了 xml 字段类型,也就是说可以直接 ...
- 在sql语句中使用 xml for path 格式化字符串的方法总结
此方法实现的是将查询表中的某个字段,格式化成 字符串1,字符串2,字符串3...的格式 假设我们现在有两个表 分别是 分组表 grouped和分组成员表 groupuser grouped表有连个字 ...
- sql语句中日期时间格式化查询
今天在做会员管理系统搜索时,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式"2007-5-22 14:32:1 ...
- 多个程序对sql server中的表进行查询和插入操作导致死锁
最近在做一个项目,是要用多个程序对sql server中的相同的数据库进行操作(查询和插入),所以在开始的时候常会出现死锁问题,后来在网上进行了咨询,发现了一些解决方法,留作大家参考: 并发去操纵一张 ...
- (4.31)sql server中的xml数据操作
关键词:xml数据转为行列方式显示 常规案例: declare @data xml declare @h int set @data=' <bookstore> <row> & ...
随机推荐
- hdu 1969(二分)
题意:给了你n个蛋糕,然后分给m+1个人,问每个人所能得到的最大体积的蛋糕,每个人的蛋糕必须是属于同一块蛋糕的! 分析:浮点型二分,二分最后的结果即可,这里要注意圆周率的精度问题! #include& ...
- Excel导出问题(导出时不去掉前面的0)(转)
最简单的方法是:在数字前面加'符号.即代码里添加: "'" 以下均是网上搜集到的其他解答: 一.代码如下: style="mso-number-format:'/@';& ...
- [转]Struts标签库详解
本文转自:http://hi.baidu.com/xzkcz/blog/item/5cf9f91f01beb9f4e0fe0bd4.html Struts提供了五个标签库,即:HTML.Bean. ...
- 先声明再定义的必要性 .xml
pre{ line-height:1; color:#9f1d66; background-color:#cfe4e4; font-size:16px;}.sysFunc{color:#5d57ff; ...
- VS2013中修改.dll工程项目的.lib和.dll的输出路径
一个dll工程,生成的两个东西是我们需要的:.lib和.dll,在实际开发过程中我们往往希望这两个东西直接输出到特定文件夹,对于这两个的修改: 设置好之后,对于调用该dll的exe工程,将exe的输出 ...
- Maven依赖
可传递的依赖: 1.具体调用哪个版本?最短依赖长度的那个 如:A -> B -> C -> D 2.0 , A -> E -> D 1.0,那么调用D 1.0 为了避免这 ...
- cocos2d 设置按钮不可用
需要两步设置按钮变灰,然后不可点击 btnBuy.setBright(false); btnBuy.setTouchEnabled(false); 或者直接不显示按钮 btnBuy.setEnable ...
- 【JSON】JSON字符串的操作(不断积累中)
一.JS遍历JSON串 示例01 目标:返回的JSON串中,一个Key对应的Value是一个数组(若在Java程序中,是一个List). 现在要求获取每个数组中的第一个对象元素中的name属性的值. ...
- Speex for Android
http://blog.csdn.net/chenfeng0104/article/details/7088138在Android开发中,需要录音并发送到对方设备上.这时问题来了,手机常会是GPRS. ...
- linux常用基本命令
Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们. 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器 ...