设为首页 收藏本站
查看: 556|回复: 0

[经验分享] XML与SQL SERVER2005 (六)

[复制链接]

尚未签到

发表于 2016-11-10 10:47:39 | 显示全部楼层 |阅读模式

XMLSQL SERVER2005 ()
------------------------------------------------------------------------
-- Author : HappyFlyStone
-- Date : 2009-09-11
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
-- 本文探讨 SQL Server 2005 中内置的 XML 支持.
-- 第六篇旨在对XQuery 的基础知识作简要说明。
-- 本文来自happyflystone -CSDN博客,
-- 转载请标明出处:http://blog.csdn.net/happyflystone
------------------------------------------------------------------------





Transact-SQL 支持用于查询 xml 数据类型的 XQuery 语言的子集。XQuery 是一种可以查询结构化或半结构化 XML 数据的语言。由于 SQL Server 2005 Database Engine中提供 xml 数据类型支持,因此可以将文档存储在数据库中,然后使用 XQuery 进行查询。
XQuery 基于现有的 XPath 查询语言,并支持更好的迭代、更好的排序结果以及构造必需的 XML 的功能。XQuery XQuery 数据模型上运行。此模型是 XML 文档以及可能为类型化也可能为非类型化的 XQuery 结果的抽象概念。类型信息基于 W3C XML 架构语言所提供的类型。如果没有可用的类型化信息,XQuery 将按照非类型化处理数据。这与 XPath 1.0 版处理 XML 的方式相似。
若要查询 xml 类型的变量或列中存储的 XML 实例,可以使用 xml 数据类型方法(下表1,不作主要说明,这个以后单独再讲)。例如,可以声明一个 xml 类型的变量,然后使用 xml 数据类型的 query() 方法来查询此变量。
1
query() XML实例进行查询
values() XML实例检索SQL类型的值
exists() 非空性检测
modify()     对XMLMDL语句进行更新
nodes() XML拆分形成多行

1XQuery
先解释两个基本概念: Sequence 和 Qnames
Sequence:序列,是XML中的一系列 XML 节点和 XSD 原子类型的实例组成。
Eg:
DECLARE @x xml

SET @x = ''

SELECT @x.query('<a>flystone</a>,<b>flystone</b>')

SELECT @x.query('"fly"," stone"')

SELECT @x.query('<a>{1+2}</a>')


/*

-------------------

<a>flystone</a><b>flystone</b>


(1 行受影响)

----------------

fly stone

(1 行受影响)

--------------

<a>3</a>

(1 行受影响)

*/
Qname: XQuery 中的每个标识符都是一个 QName。QName 由一个命名空间前缀和一个本地名称组成。下面我们举一个不带前缀的例子:
DECLARE @x xml

SET @x = '<root><name>flystone1</name><name>flystone2</name></root>'

SELECT @x.query('//root/name')


/*
-----------------
<name>flystone1</name><name>flystone2</name>

(1 行受影响)
*/
//root/name 即是表达式,在这个表达式中,root name QNames

2、预定义命名空间
前缀            URI
xs http://www.w3.org/2001/xmlxchema
xsi http://www.w3.org/2001/xmlschema-instance
xdt http://www.w3.org/2004/07/xpath-datetypes
fn http://www.w3.org/2004/07/xpath-functions
无 urn:schemas-microsoft-com:xml_sql
sqltypes http://schemas.microsoft.com/sqlserver/2004/sqltypes
xml http://www.w3.org/xml/1998/namespace
无 http://schemas.imcrosoft.com/sqlserver/2004/soap


3、 分析和计算表达式

计算 Xquery的表达式分为两个阶段:静态上下文、动态上下文
a、静态上下文(查询编译阶段)

这个阶段主要完成如下过程:

l 边界空格
l 初始化前缀和命名空间绑定
l 可类型化列或变量导入XML 架构集合的组件
l 可用转换函数

b、动态上下文(查询执行阶段)


2、 原子化

原子化是提取项的类型化值的进程。可隐式或非隐式进行的。还是举几个例子吧
DECLARE @x xml

SET @x = '

<root>

<name count="1">flystone1</name>

<name count="5">flystone2</name>

</root>'

SELECT @x.query('sum(//root/name/@count)')

SELECT @x.query('sum(data(//root/name/@count))')

SET @x = '

<root>

<name count="1">1</name>

<name count="5">2</name>

</root>'

SELECT @x.query('sum(//root/name)')

SELECT @x.query('sum(data(//root/name))')

/*

-----------------

6

(1 行受影响)

-----------------

6

(1 行受影响)

-----------------

3

(1 行受影响)

-----------------

3

(1 行受影响)

*/
XQuery 函数属于 http://www.w3.org/2004/07/xpath-functions 命名空间。W3C 规范使用“fn:”命名空间前缀来说明这些函数。使用这些函数时,不必显式指定“fn:”命名空间前缀。由于这个原因,也为了提高可读性,此文档中通常不使用命名空间前缀。相关的函数我们可以查阅:
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/udb9/html/8df0877d-a03f-4ca9-b84e-908c4bb42b5e.htm
我们仅用几个例子来说明一下,
ceiling()这个函数再熟悉不过了,取不小于当前数的最小整数(语句中有FLWOR,这个以后再说)。
DECLARE @x xml

SET @x = '

<root>

<name count="1.9">flystone1</name>

<name count="1.2">flystone2</name>

</root>'

SELECT @x.query('

for $i in //root/name

return

<name count="{ceiling($i/@count)}">

  { $i/node() }

</name>

')


/*

-----------------------------------------------------------------

<name count="2">flystone1</name><name count="2">flystone2</name>


(1 行受影响)

*/
最后用两个SQL Server XQuery 扩展函数的个例子:
DECLARE @x table(id int,col xml)

insert @x select 1,'flystone1'

insert @x select 2,'flystone2'


SELECT id,col.query('

<col id="{sql:column("id")}">{/node()}

</col>') as col

from @x


/*

id col

----------- -----------------

1 <col id="1">flystone1 <col/>

2 <col id="2">flystone2 <col/>

(2 行受影响)

*/
declare @i int,@x xml

set @i = 21000

set @x = '

<root>

<name>flystone1</name>

<name>flystone2</name>

</root>'

select @x.query('

for $i in //root/name

return

<name postcode="{sql:variable("@i")}">

  {$i/node()}

</name>

')


/*

----------------------------------------------------------

<name postcode="21000">flystone1</name><name postcode="21000">flystone2</name>


(1 行受影响)

*/



3、 有效的boolean

个人感觉也没什么复杂的,有时的点绕人而已,先来个简单的例子:
DECLARE @x XML

SET @x = '<b/>'

SELECT @x.query('if (/a[1]) then "true" else "false"')

SELECT @x.query('if (/b[1]) then "true" else "false"')

/*

-----------

false

(1 行受影响)


-----------

true

(1 行受影响)

*/
再来一些有趣的:
DECLARE @x table(id int,col xml)

insert @x select 1,'<name sex="男"><a><b/><c>flystone1</c></a></name>'

insert @x select 2,'<name sex="女"><a>flystone2</a></name>'


SELECT id,col.query('

<col id="{sql:column("id")}">{/node()}

</col>') as col

from @x

where col.exist('/name[not(/name/a/*)]') = 0

/*

id col

----------- --------------------------------------------------------

1 <col id="1"><name sex="男"><a><b /><c>flystone1</c></a></name></col>


(1 行受影响)


la

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298379-1-1.html 上篇帖子: XML与SQL SERVER2005 (二) 下篇帖子: 经典SQL语法大全
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表