SQL中XQuery/XML的应用

XML及SQL作为两种存储数据的主流方式,各自有各自的优势.为此主流的数据库产品中陆续的加入了对XML的支持.

1.对于SQL返回的结果集可以对其进行XML转换.

2.在MS SQL2005中加入了XML类型.允许将XML数据存入对应的表列中,并且也实现了结合XQuery(部分功能未实现)来对XML数据进行操作的功能.

创建对应的数据库及表信息.

create database people;
use people;
create table people (id int identity primary key,firstname text not null,lastname text not null,age int not null,sex varchar(10) not null)

初始化数据.

insert into people values ('Ricky','Lin',30,'male');
insert into people values ('Jennie','Lin',30,'female');


查询数据并以XML格式返回.

select id [@id],firstname [name/firstname],lastname [name/lastname],age [age],sex [sex] from people for xml path('person'),root('people')

获取到的结果.

<people>
  <person id="1">
    <name>
      <firstname>Ricky</firstname>
      <lastname>Lin</lastname>
    </name>
    <age>30</age>
    <sex>male</sex>
  </person>
  <person id="2">
    <name>
      <firstname>Jennie</firstname>
      <lastname>Lin</lastname>
    </name>
    <age>30</age>
    <sex>female</sex>
  </person>
</people>


另外还有for xml auto / for xml raw 等选项也可以支持XML输出.并可以添加对应的参数来丰富输出的格式.

2.SQL对于XML的支持更重要的表现在XML类型的存储和操作.以下主要说明的是modify/query这两个函数.其中主要的应用是针对XQuery.

declare @original xml;
set @original = 
'
<person>
	<firstname>Ricky</firstname>
	<lastname>Lin</lastname>
</person>
';
/*modify*/
declare @delete xml;
declare @insert xml;
declare @replace xml;

set @delete = @original;
set @insert = @original;
set @replace = @original;

set @delete.modify('delete /person/*[1]') ;
select @delete 'delete';/*delete firstname element.*/

set @insert.modify('insert <middle>OK</middle> after (/person/firstname)[1]');
select @insert 'insert';/*insert the middle name after firstname*/


declare @replacement varchar(20);
set @replacement = 'Jennie';
set @replace.modify('replace value of (/person/firstname/text())[1] with sql:variable("@replacement")');
select @replace 'replace';/*replace the firstname 'Ricky' to 'Jennie'*/

modify函数主要提供了三种方式对XML类型数据的修改.

delete/replace/insert. 其参数中主要应用了XQuery/XPath来获取对应的节点以供操作.

以下例子是使用query函数来处理带名称空间的的情况.

declare @data xml;
set @data = 
'
<person xmlns="http://www.ricky.com">
	<firstname>Ricky</firstname>
	<lastname>Lin</lastname>
</person>
'
;

select @data.query('
	declare namespace ricky = "http://www.ricky.com";
	<name>{ricky:person/ricky:firstname/text()}-{ricky:person/ricky:lastname/text()}</name>
') result;


在SQL与XML结合使用的过程中,主要的应用实现行是针对于XQuery.当然或许现阶段SQL并无法完全的兼容XQuery语法.但是已经足够了日常需求.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值