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> & ...
随机推荐
- swfupload浅谈
首先,先介绍一个swfUplod吧. SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合flash与javascript技术为web开发者提供了一个具有丰富功 ...
- ylb:SQL Server中的escape(逃逸)
ylbtech-SQL Server:SQL Server-SQL中的escape(逃逸) SQL Server中的escape(逃逸). 1,SQL Server中的escape(逃逸) 返回顶部 ...
- 将a、b的值进行交换,并且不使用任何中间变量
方法1:用异或语句 a = a^b; b = a^b; a = a^b; 注:按位异或运算符^是双目运算符,其功能是参与运算的两数各对应的二进制位相异或,当对应的二进制相异时,结果为1.参与运算数仍以 ...
- CAT XQX --- 省市三级级联实现说明
最终效果: 满足要求, 上代码 : 1. 需要调用这个控件 的地方:添加引用,因为里面写着逻辑呢..... <script type="text/javascript" ...
- 【Unity入门】编辑器常用视图介绍
版权声明:本文为博主原创文章,转载请注明出处. 打开Unity编辑器的主窗口,在窗口的右上角可以看到有个“Layout”按钮.这是用来对Unity编辑器主窗口上面的各个窗口面板进行布局的.通常情况下我 ...
- 【LeetCode】66 & 67- Plus One & Add Binary
66 - Plus One Given a non-negative number represented as an array of digits, plus one to the number. ...
- 了解一下jsp
本着和大家共同学习jsp的原则,今天谈一谈jsp. 首先,JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户 ...
- 在VS2103环境中集成Doxygen工具
自己已将学习了两三次了吧,差不多这次该总结一下: Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持P ...
- jQuery Mobile 页面事件总结
一.页面初始化事件(Page initiallization) 在页面创建前,当页面创建时,以及在页面初始化之后.只在第一次加载时执行. 1. pagebeforecreate 页面创建前 [sour ...
- CUDA ---- Hello World From GPU
本篇博文仅实现hello world,先看到效果,具体细节将在后续博文解释. 准备 如果你是第一次使用CUDA,在Linux下可以使用下面的命令来检查CUDA编译器是否安装正确: $ which nv ...