>

转发--SQL Server 二零零七的XQuery介绍

- 编辑:乐百家599手机首页 -

转发--SQL Server 二零零七的XQuery介绍

TYPE命令

SQL Server协理TYPE命令将FOPAJERO XML的询问结果作为XML数据类型再次来到。
示例13:依旧是地点的例子,将查询结果作为XML数据类型重返。

CREATE TABLE xmlType(xml_col XML);
--首先创建一个表xmlType,只有一列xml数据类型的xml_col
INSERT INTO xmlType
SELECT(--将上面的查询语句全部复制到括号中,末尾加上TYPE,表示将XML文档作为xml数据类型,并插入到表xmlType中
SELECT xmlTest.学号 AS '学生信息/@学号',
xmlTest.学生姓名 AS '学生信息/@姓名',
xmlTest.班级 AS '学生信息/@班级',
mainTeacher.姓名 AS '学生信息/班主任信息/姓名',
mainTeacher.教师编号 AS '学生信息/班主任信息/教师编号',
mainTeacher.性别 AS '学生信息/班主任信息/性别',
mainTeacher.年龄 AS '学生信息/班主任信息/年龄',
mainTeacher.联系电话 AS '学生信息/班主任信息/联系电话'
FROM xmlTest,mainTeacher
WHERE xmlTest.年级总分>=700
AND xmlTest.班主任=mainTeacher.姓名
FOR XML PATH('result'),TYPE
);
SELECT * FROM xmlType;--查询xmlType表

查询结果如图所示
乐百家数据库 1
双击张开查看XML

<result>
  <学生信息 学号="20180105" 姓名="王婷" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>
<result>
  <学生信息 学号="20180109" 姓名="甄诚" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>

接下去我们看看哪些定义三个XML的列

在底下的事例中,作者将创立三个集团客商的表,表中存放了ID和各种公司的客商音讯。

USE AdventureWorks2008R2
GO
IF OBJECT_ID('dbo.StoreClients') IS NOT NULL
DROP TABLE dbo.StoreClients
GO
CREATE TABLE dbo.StoreClients
(
StoreID INT IDENTITY PRIMARY KEY,
ClientInfo XML NOT NULL
)
GO

接下去插入数据到那么些表中,包涵XML的文书档案和一部分。作者将宣示一个XML的变量,然后用那几个变量插入那一个文书档案到表的数据行里面。

DECLARE @ClientList XML
SET @ClientList =
'<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>'
INSERT INTO dbo.StoreClients (ClientInfo)
VALUES(@ClientList)
GO

就算变量将总体XML文书档案插入了进去,然而它是被看成二个单纯的值插入到表列里面来。

比较以上所述,创造和插入都以很直白省略的,接下去我们看一下什么创制一个XML的参数

概念一个XML参数

例如,我定义@StoreClients 作为三个输入参数,并且布署它为XML的品种

USE AdventureWorks2008R2
GO
IF OBJECT_ID('dbo.AddClientInfo', 'P') IS NOT NULL
DROP PROCEDURE dbo.AddClientInfo
GO
CREATE PROCEDURE dbo.AddClientInfo
@StoreClients XML
AS
INSERT INTO dbo.StoreClients (ClientInfo)
VALUES(@StoreClients)
GO

接下来我们再看看在仓储进程中什么运用XML作为参数:

DECLARE @ClientList XML
SET @ClientList =
'<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>'
EXEC dbo.AddClientInfo @ClientList

进程也是很直白,先将XML数据赋值给变量,然后将变量作为参数执行SP,那是查询你会意识数目现已在表中了。

方今大家要上学一下XML类型辅助的方法:query(``), value().

在那后面我们要驾驭一种表明式,正是XQuery,它是一种庞大的脚本语言,用来收获XML的数量。SQLServer 扶助这种语言的子集,所以大家能利用这种语言的表达式来探求和修改XML的多少。

为便利起见,您恐怕必要将此 XSL 样式表保存在数据库中,然后再起来应用它。举例,您能够将样式表作为文件财富保存在 Oracle XML DB 音信库中。实施该操作的办法之一是将样式表作为文件保留到地点文件系统中,然后采纳以下某些互连网球组织议将它移动到 XML 新闻库:FTP、HTTP 或 WebDAV。倘让你曾经将列表 4 中的 XSLT 样式表作为 orderTotal.xsl 保存在 /public 消息库文件夹中,现在能够按以下示例所示将它用作 XMLTransform SQL 函数的参数(若是你以 OE/OE 的身份登陆):

          <Therapy>Oral Rehydration Therapy</Therapy>

XQuery简介

XQuery是一种查询语言,能够查询结构化或然半结构化的数据。SQL Server 2010中对XML数据类型提供了支撑,可以存款和储蓄XML文书档案,然后选用XQuery语言进行查询。

  • 一个实例的XML列无法饱含超越2GB的数码。
  • 一个XML的列无法是索引。
  • XML对象不可能运用Group By的子句中。
  • XML的数据类型不帮忙相比和排序。

该组织应生成以下输出:

SET @Weather = '

主XML索引

主XML索引对XML列中XML实例内的装有标志,值和路线进行索引。创造主XML索引时,相应XML列所在的表必需对该表的主键创设了集中索引。

XML的value()方法

就像同query()方法同样方便,比比较多时候当您想去检索二个一定的成分或性质的时候,实际不是赢得XML的要素,那就足以应用value()了。这种形式只会回去多个一定的值,不作为数据类型。由此必得求传送四个参数XQuery表明式和T-SQL数据类型。下边看语法:

db``_object``.value('``xquery_exp``', '``sql_type``')

SELECT 
  Info_untyped.value(
    '(/People/Person[1]/FirstName)[1]', 
    'varchar(20)') AS Name_untyped,
  Info_typed.value(
    'declare namespace ns="urn:ClientInfoNamespace";
    (/ns:People/ns:Person[2]/ns:FirstName)[1]',
    'varchar(20)') AS Name_typed
FROM ClientInfo;

Listing 16: 检索<FirstName> 的值

在Listing16中,小编钦点了[1]在Xquery表达式的末尾,所以结果集将只回去第一私有的名字。

Name_untyped         Name_typed
-------------------- --------------------
John                 Jane

Listing 17: <FirstName>的两个结果

当然,大家也得以搜索种种实例的id的属性值,而且钦定Int类型重临。

SELECT 
  Info_untyped.value(
    '(/People/Person/@id)[1]', 
    'int') AS Name_untyped,
  Info_typed.value(
    'declare namespace ns="urn:ClientInfoNamespace";
    (/ns:People/ns:Person/@id)[2]',
    'int') AS Name_typed
FROM ClientInfo;

Listing 19: 检索七个实例的id属性值

Name_untyped         Name_typed
-------------------- --------------------
1234                 5678

Listing 20: 重回三个id的质量

除此而外在表达式中定义你的XQuery表达式,你也能集结的效果与利益来进一步定义你的查询和操作数据。比方,count()成效,大家来获得各类列中<Person> 成分的个数。

SELECT 
  Info_untyped.value(
    'count(/People/Person)', 
    'int') AS Number_untyped,
  Info_typed.value(
    'declare namespace ns="urn:ClientInfoNamespace";
    count(/ns:People/ns:Person)',
    'int') AS Number_typed
FROM ClientInfo;

Listing 21: 使用count成效来探索元素个数

结果如下:

Number_untyped Number_typed
-------------- ------------
2              2

Listing 22: 每列数据中<Person> 成分的数目

其它多个常用的遵守是concat(``), 它能够接二连三八个或三个XML成分下的多寡。你能够钦定你想连接的每三个局地。示例:

SELECT 
  Info_untyped.value(
    'concat((/People/Person/FirstName)[2], " ", 
      (/People/Person/LastName)[2])', 
    'varchar(25)') AS FullName
FROM ClientInfo;

Listing 23: 使用concat(``)来连接数值

FullName
-------------------------
Jane Doe

Listing 24: 连接后的重临值

名和姓被连接起来,组成贰个纯净的值。都来源于于同一个<Person> 下,当然也足以来自不一样。

则 XQuery 表明式重回的空系列将与 purchaseorder 表联接,进而包涵在询问总括果集中。实际上,那象征输出将不止满含为用户EABEL 央求的订单生成的 OrderTotal 成分,何况还蕴涵为 purchaseorder 表中存款和储蓄的兼具别的订单生成的空行(暗中同意境况下,purchaseorder 表蕴涵 132 行)。从结果聚焦清除空行的方法之一是在 SELECT 语句的 WHERE 子句中使用 existsNode SQL 函数,并不是在 XQuery 表达式中利用 WHERE 子句,如下所示:

                <Temp Date="2004-11-05" High="54" Low="41" />

修改和删除索引(ALTE本田CR-V INDEX 和 DROP INDEX)
ALTER INDEX ALL ON Student--重建所有索引
REBUILD WITH(FILLFACTOR=80,SORT_IN_TEMPDB=ON,STATISTICS_NORECOMPUTE=ON);
--删除索引
DROP INDEX 学生信息表 ON Student
GO

注:删除主索引,与其连带的装有辅助索引也会被删去。由此地点语句中去除学生消息表索引后,帮助学生新闻表索引也被删去了。

自己设定了变量的值,然后利用select 来查找那些值。和我们想的一样,它回到了XML的文书档案。如下:

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

                element StartDate { string($ED/RES:Edu.StartDate)},

FOR XML EXPLICIT

允许客商显式地定义XML树的样子,不受AUTO方式中的各个限制。不能够将FOKuga XML EXPLICIT直接用在SELECT子句中。
示例11:将xmlTest表转换为XML格式(FOR XML EXPLICIT)
XmlTest表的数据如图所示
乐百家数据库 2

SELECT DISTINCT 1 AS TAG,--指定顶级层级序号1
NULL AS PARENT,--该层级没有父级
NULL AS '班级信息!1!',
NULL AS '班级信息!2!班级',
NULL AS '班级信息!2!班级类型',
NULL AS '班级信息!2!班主任',
NULL AS '学生信息!3!学号!Element',
NULL AS '学生信息!3!学生姓名!Element',
NULL AS '学生信息!3!性别!Element',
NULL AS '学生信息!3!总分!Element'--设置所有层级元素和属性命名,暂时不对这些元素赋值
--例如在“学生信息!3!总分!Element”格式中,学生信息是元素名,3表示该元素所处层级,总分表示属性名
--Element指出生成以属性单独为一行的XML格式
UNION ALL--层级之间用UNION ALL相连
SELECT DISTINCT 2 AS TAG,--指定二级层级序号2
1 AS PARENT,--父级序号是序号为1的层级
NULL,--在层级的代码中已列出了所有层级元素和属性命名,因此这里给元素和属性做赋值。这句语句对应层级代码中“NULL AS '班级信息!1!'”,说明我希望该元素作为独立成行的标签,没有赋值。
班级,--对层级中的“NULL AS '班级信息!2!班级'”赋值,将xmlTest表中的班级赋值给属性班级
班级类型,--对层级中的“NULL AS '班级信息!2!班级类型'”赋值,将xmlTest表中的班级赋值给属性班级类型
班主任,--同上
NULL,--这句语句开始对应的是层级的属性,因此在层级的代码中不做赋值,在下面层级的代码中做赋值
NULL,
NULL,
NULL
FROM xmlTest--指出上面赋值的数据源来自于xmlTest表
UNION ALL--各个层级之间用UNION ALL连接
SELECT 3 AS TAG,--指定3级层级序号3
2 AS PARENT,--父级是序号为2的层级
NULL,--对应层级的”NULL AS '班级信息!1!'“语句,不希望它有值,所以不做赋值
NULL,--这三个NULL对应层级的各个属性,在层级的代码中已经做过赋值,因此在这里不做赋值
NULL,
NULL,
学号,--对应层级1代码中的层级3属性,在层级代码3中进行赋值
学生姓名,
性别,
年级总分
FROM xmlTest
FOR XML EXPLICIT;--将上述查询转换为XML,不能漏掉,否则结果会以表格形式显示

查询结果如图所示
乐百家数据库 3
乐百家数据库 4
在结果图中大家开采,红框中3个班级音信列在联合,而享有学员都列在高级中学一年级3班下,那不是我们想要的结果,大家希望每种班级对应自身的学员。那么哪些减轻此类难题啊,这件事关到排序。

注:假如层级中有八个数据完全重复,能够在该层级对应的代码前加DISTINCT关键字去除重复成分。

首先删除代码行末的FO君越 XML EXPLICIT语句,仅仅实践剩下的有的,使结果以表格格局表现,那么结果如下
乐百家数据库 5
以此表格每行的逐一也表示了该表格转化为XML文书档案后内容展示顺序。图中层级2(TAG=2)的几行,地点都在联合签字,那也正是为啥层级3的富有数据都在高级中学一年级3班下边了。大家须要对表格每行的依次实行调度,使学员所在行根据xmlTest表中的数据逻辑分散在班级行之下。可是依附地点的表格开采,不管遵照什么样字段排序,都不容许高达效果。
无庸置疑代码如下

SELECT DISTINCT 1 AS TAG,
NULL AS PARENT,
NULL AS '班级信息!1!',
NULL AS '班级信息!2!班级',
NULL AS '班级信息!2!班级类型',
NULL AS '班级信息!2!班主任',
NULL AS '学生信息!3!学号!Element',
NULL AS '学生信息!3!学生姓名!Element',
NULL AS '学生信息!3!性别!Element',
NULL AS '学生信息!3!总分!Element'
UNION ALL
SELECT DISTINCT 2 AS TAG,
1 AS PARENT,
NULL,
班级,
班级类型,
班主任,
NULL,
NULL,
NULL,
NULL
FROM xmlTest
UNION ALL
SELECT 3 AS TAG,
2 AS PARENT,
NULL,
班级,
班级类型,
班主任,
学号,
学生姓名,
性别,
年级总分
FROM xmlTest
ORDER BY [班级信息!2!班级],[学生信息!3!学号!Element]
FOR XML EXPLICIT;

相比第叁次代码,大家开掘上边的代码不仅在行末对数据按成分属性进行了排序,还在赋值的代码中具备退换。在层级1代码中全然没有改观,因为层级1的代码功效是设置XML格式的,对数码排序未有影响。在底下多少个层级的赋值部分,每个层级的代码中都对地方多少个层级的成分重复赋值,那样做使结果的报表中不再有那么多属性值是NULL,能够一本万利排序。最终再根据成分[班级消息!2!班级]和[学生消息!3!学号!Element]排序。让大家看看结果怎么样。
运维方面包车型大巴代码,但不运营FOXC60 XML EXPLICIT语句,看看表格中数量内容和行顺序是不是变动
乐百家数据库 6
如图所示,发掘行数据和学习者数量的各种呈现精确。运营具有代码得到XML文书档案,结果如图所示
乐百家数据库 7
出于XML文书档案内容过长,不贴图了,直接复制全数XML内容彰显一下。

<班级信息>
  <班级信息 班级="高一1班" 班级类型="创新班" 班主任="李玉虎">
    <学生信息>
      <学号>20180101</学号>
      <学生姓名>李华</学生姓名>
      <性别>男</性别>
      <总分>5.680000000000000e 002</总分>
    </学生信息>
    <学生信息>
      <学号>20180103</学号>
      <学生姓名>孙丽</学生姓名>
      <性别>女</性别>
      <总分>3.390000000000000e 002</总分>
    </学生信息>
    <学生信息>
      <学号>20180108</学号>
      <学生姓名>吴伟</学生姓名>
      <性别>男</性别>
      <总分>5.280000000000000e 002</总分>
    </学生信息>
  </班级信息>
  <班级信息 班级="高一2班" 班级类型="重点班" 班主任="姜杰">
    <学生信息>
      <学号>20180102</学号>
      <学生姓名>张三</学生姓名>
      <性别>男</性别>
      <总分>6.270000000000000e 002</总分>
    </学生信息>
    <学生信息>
      <学号>20180104</学号>
      <学生姓名>袁康</学生姓名>
      <性别>男</性别>
      <总分>4.820000000000000e 002</总分>
    </学生信息>
    <学生信息>
      <学号>20180106</学号>
      <学生姓名>赵四</学生姓名>
      <性别>男</性别>
      <总分>5.680000000000000e 002</总分>
    </学生信息>
  </班级信息>
  <班级信息 班级="高一3班" 班级类型="提高班" 班主任="师从光">
    <学生信息>
      <学号>20180105</学号>
      <学生姓名>王婷</学生姓名>
      <性别>女</性别>
      <总分>7.610000000000000e 002</总分>
    </学生信息>
    <学生信息>
      <学号>20180107</学号>
      <学生姓名>周其</学生姓名>
      <性别>女</性别>
      <总分>3.480000000000000e 002</总分>
    </学生信息>
    <学生信息>
      <学号>20180109</学号>
      <学生姓名>甄诚</学生姓名>
      <性别>女</性别>
      <总分>7.020000000000000e 002</总分>
    </学生信息>
  </班级信息>
</班级信息>

将上面的结果对比一下原始xmlTest表,看看每种班级和它下属学生的层级关系是还是不是有误。

注:写FO奔驰M级 XML EXPLICIT代码要注意,层级1的代码中先安装层级结构,不要先急着赋值。在下级层级的代码中对层级1中的代码实行赋值,最棒重复赋值,不然就能油可是生文中的排序难题。要是某些层级出现重复数据,在该层级的代码前加DISTINCT关键字。解决排序难点最棒的法门是对种种层级的天性重复赋值并在最终用OQashqaiDER BY按层级属性排序。

留意观看地点的XML文书档案,发掘总分属性的值是个float类型,要把它转换来int,只需求把层级3中对总分的赋值代码改成CAST(年级总分 AS int)
乐百家数据库 8

XML的数据类型确定保障了您的XML数据被完好的构建保存,同时也契合ISO的行业内部。在概念三个XML数据类型从前,大家率先要明了它的三种限制,如下:

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType 数据部分中的示例使用的 XQuery 表明式举行相比较,您恐怕会小心到,XQuery 方法要比 XSLT 方法更具吸重力。至少在行使 XQuery 时,您只需编写非常少的代码就可以获取同等的末段结出。

        declare namespace RES="";

类型化的XML和非类型化的XML

可以创制xml类型的变量,参数和列,恐怕将XML架构会集和xml类型的变量、参数或列关联,这种景观下,xml数据类型实例称之为类型化xml实例。不然XML实例称为非类型化的实例。

 

COUNT(*)
----------
9
Execution Plan
---------------------------------------------
Plan hash value: 4046110317
--------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 226 | 29 (0) | 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 226 | | |
| 2 | NESTED LOOPS | | 10782 | 2379K | 29 (0) | 00:00:01 |
|* 3 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 226 | 5 (0) | 00:00:01 |
| 4 | COLLECTION ITERATOR P| XMLSEQUENCEFROMX| | | | |
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(SYS_CHECKACL("ACLOID","OWNERID",xmltype('...

DECLARE @result xml

辅助XML索引

为了加强主XML索引的品质,可以创立帮助XML索引。独有创设了主XML索引后本事成立补助XML索引。援助XML索引分3种:PATH,VALUES和PROPERTY支持XML索引。

<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>

在以上示例中,您在 XMLTable 函数的 PASSING 子句中运用 OBJECT_VALUE 虚构列将 purchaseorder 表作为左右文项传递给这里使用的 XQuery 表明式。XQuery 表明式总计客商 EABEL 哀求的各种购买订单的共计,并为管理的各类订单生成三个 OrderTotal XML 成分。要拜候生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE 虚构列。最后的出口应如下所示:

                element GPAScale { string($ED/RES:Edu.GPAScale)}

XML数据类型

XML是SQL Server中寄放的数据类型,可用于SQL语句大概当作存储进程的参数。客商可以一贯在数据库中积累、查询和管理XML文件。XML数据类型仍可以够保存整个XML文书档案。XML数据类型和任何数据类型海市蜃楼根本上的反差,能够把它用在别的一般SQL数据类型能够选取的地点。
示例1:创制三个XML变量并用XML填充

DECLARE @doc XML
SELECT @doc='<Team name="Braves" />';

示例2:成立XML数据类型列

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column1));

在上头的自己要作为范例遵守规则中,column2列是XML数据类型列。
示例3:无法将XML数据类型列设置为主键或外键

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column2));

实施下面的代码,报错如下:
消息1919,级别16,状态1,第1 行
表't1' 中的列'column2' 的门类不能够用作索引中的键列。
消息1750,级别16,状态0,第1 行
不能够创建约束。请参阅前边的百无一是音信。
XML数据类型的接纳限制
独有STRubiconING数据类型工夫转变来XML。
XML列无法动用于GROUP BY语句中
XML数据类型存款和储蓄的数码不可能超出2GB
XML数据类型字段不可能被设置成主键或然外键或称为其一部分。
Sql_variant数据类型字段的选择不可能把XML数据类型作为种子项目。
XML列无法钦定为唯一的。
COLLATE子句无法被采取在XML列上。
积累在数据库中的XML仅补助128级的层系。
表中最对只可以具有33个XML列。
XML列不能够步入到法则中。
独一可利用于XML列的停放标量函数是ISNULL和COALESCE。
怀有XML数据类型列的表不可能有二个超过15列的主键。

SQL Server对于XML辅助的主干在于XML数据的格式,这种数据类型能够将XML的多寡存款和储蓄于数据库的靶子中,比如variables, columns, and parameters。当您用XML数据类型配置那几个目的中的二个时,你内定项目标名字就疑似您在SQLServer 中内定二个品种一样。

SELECT XMLQuery('for $i in fn:doc("/public/employees/employees.xml")
return;
$i'
RETURNING CONTENT) AS RESULT FROM DUAL;

        element CustomerInfo

乐百家数据库 ,XML数据类型方法

XML数据类型共有5种形式
query():实践五个XML查询并回到查询结果(再次回到四个XML数据类型)。
示例4

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SELECT @xmlDoc.query('/students/class/student') AS test
--用query()查询@xmlDoc变量实例中标签<student>的子元素

询问结果如图所示
乐百家数据库 9
点击查询结果
乐百家数据库 10
如想查询标签

DECLARE @addr XML--声明一个XML类型变量@addr
SET @addr='/students/class/student'
SELECT @addr.exist('/students/class="江苏"') AS 返回值

结果如图所示
乐百家数据库 11

注:exsit()方法的参数不必做正鲜明位

Value():计算一个询问并从XML中回到叁个简短的值(只可以回到单个值,且该值为非XML数据类型)。
Value()方法有2个参数XQuery和SQLType,XQuery参数表示命令要从XML实例之中查询数据的具体地点,SQLType参数表示value()方法重临的值的主要推荐数据类型。
示例6

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
DECLARE @classID INT--声明INT类型的变量@classID
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SET @classID=@xmlDoc.value('(/students/class/@NO)[1]','INT')
--将value()方法返回值赋值给变量@classID
SELECT @classID AS classID

查询结果如图所示
乐百家数据库 12

注:SQLType无法是XML数据类型,公共语言运营时(CLXC60)客户定义类型,image,text,ntext或sql_variant数据类型,但足以是顾客自定义数据类型SQL。

Modify():在XML文书档案的适合地方推行一个修改操作。它的参数XML_DML代表一串字符串,依照此字符串表达式来更新XML文书档案的剧情。
示例7:在@xmlDoc的实例中,成分

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'
SELECT @xmlDoc AS '插入节点前信息'
SET @xmlDoc.modify('insert <学历>本科</学历> after (students/class/student/age)[1]')
SELECT @xmlDoc AS '插入节点后信息'

询问结果插入节点后音信如图所示
乐百家数据库 13

注:modify()方法的参数中insert和别的重大字必需小写,不然会报错

Nodes():允许把XML分解到二个表结构中。此情势将XML数据类型实例拆分为关周到据,并回到包涵原始XML数据的行集。
示例8:依然用@locat参数的实例来演示

DECLARE @locat XML--声明XML变量@locat
SET @locat=
'<root>
    <location locationID="8">
        <step>8的步骤</step>
        <step>8的步骤</step>
        <step>8的步骤</step>
    </location>
    <location locationID="9">
        <step>9的步骤</step>
        <step>9的步骤</step>
        <step>9的步骤</step>
    </location>
    <location locationID="10">
        <step>10的步骤</step>
        <step>10的步骤</step>
        <step>10的步骤</step>
    </location>
    <location locationID="11">
        <step>11的步骤</step>
        <step>11的步骤</step>
        <step>11的步骤</step>
    </location>
</root>'--@locat变量的实例

SELECT T.Loc.query('.') AS result
FROM @locat.nodes('/root/location') T(Loc)
GO

询问结果如下图所示
乐百家数据库 14

The XML query() Method

query方法,平日被用来回到一个点名XML子集的无类型的XML实例,如下,用括号加单引号来兑现表明式,语法:

db``_object``.query('``xquery_exp``')

当大家调用这一个艺术时,用诚实数据库对象替换掉引号内的表明式。通超过实际例来相比一下结实有怎样不相同。

SELECT Info_untyped.query('/People')
  AS People_untyped
FROM ClientInfo;

Listing 2: 使用query(``) 来获得<People>元素中的值

在这种情形下,将再次来到标签下全数的因素,包蕴子成分属性以及它们的值。

<People>
  <Person id="1234">
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
  </Person>
  <Person id="5678">
    <FirstName>Jane</FirstName>
    <LastName>Doe</LastName>
  </Person>
</People>

Listing 3: 结果集重回了/People 的内容

如若希图寻找类型化的列中的<People> 成分的开始和结果,作者必要修改XQuery的说明式。如Listing 4

SELECT Info_typed.query(
  'declare namespace ns="urn:ClientInfoNamespace";
  /ns:People') AS People_typed
FROM ClientInfo;

Listing 4: 使用query(``) 来检索类型化的XML列,然后你运营那一个讲话,就能拿走结果如Listing5

<People xmlns="urn:ClientInfoNamespace">
  <Person id="1234">
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
  </Person>
  <Person id="5678">
    <FirstName>Jane</FirstName>
    <LastName>Doe</LastName>
  </Person>
</People>

Listing 5: 呈现结果

如上,我们发掘三种结果是很相近的,独一的界别就是类型化的列里面包括了关系的命名空间。

若果大家筹划获得子下拔尖,子成分的剧情,大家供给修改表明式,通过充裕/Person 到路径名称中,如下:

SELECT 
  Info_untyped.query(
    '/People/Person') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person') AS People_typed
FROM ClientInfo;

Listing 6: 检索 <Person> 元素

<Person id="1234">
  <FirstName>John</FirstName>
  <LastName>Doe</LastName>
</Person>
<Person id="5678">
  <FirstName>Jane</FirstName>
  <LastName>Doe</LastName>
</Person>

Listing 7: 那些结果集是非类型化数据的结果

<ns:Person xmlns:ns="urn:ClientInfoNamespace" id="1234">
  <ns:FirstName>John</ns:FirstName>
  <ns:LastName>Doe</ns:LastName>
</ns:Person>
<ns:Person xmlns:ns="urn:ClientInfoNamespace" id="5678">
  <ns:FirstName>Jane</ns:FirstName>
  <ns:LastName>Doe</ns:LastName>
</ns:Person>

Listing 8: 这些结果集是类型化数据的结果

设若大家筹算去获得内定的<Person>下面的某一个元素,需要加入涉及的id属性。下面对比类型和非类型的两种情况下指定元素属性时如何获取。

SELECT 
  Info_untyped.query(
    '/People/Person[@id=1234]') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person[@id=5678]') AS People_typed
FROM ClientInfo;

Listing 9: 检索数据,钦点成分

眼下的尚未变动,依据成分来加多表达式,然后用中括号,在中括号内增加了@id的值,结果如下

<Person id="1234">
  <FirstName>John</FirstName>
  <LastName>Doe</LastName>
</Person>

Listing 10: id为1234非类型化数据结果重临值。

对此类型化的列,小编动用的id为5678.小心,这一次不再须要在性质名称前增加命名空间的前缀了,只须求在要素名字前引述就够用了。

<ns:Person xmlns:ns="urn:ClientInfoNamespace" id="5678">
  <ns:FirstName>Jane</ns:FirstName>
  <ns:LastName>Doe</ns:LastName>
</ns:Person>

Listing 11: id为5678的数量结果

更进一竿的显得结果,向下一级

SELECT 
  Info_untyped.query(
    '/People/Person[@id=1234]/FirstName') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person[@id=5678]/ns:FirstName') AS People_typed
FROM ClientInfo;

结果

<FirstName>John</FirstName>

<ns:FirstName xmlns:ns="urn:ClientInfoNamespace">Jane</ns:FirstName>

乐百家lo599 ,Listing 14: 名字的结果的体现

本来还足以因此数字索引的措施体现:

SELECT 
  Info_untyped.query(
    '/People/Person[1]/FirstName') AS People_untyped,
  Info_typed.query(
    'declare namespace ns="urn:ClientInfoNamespace";
    /ns:People/ns:Person[2]/ns:FirstName') AS People_typed
FROM ClientInfo;

Listing 15: 使用数字索引来援引元素下的结果

SELECT ttab.COLUMN_VALUE AS OrderTotal FROM purchaseorder,
XMLTable(
'for $i in /PurchaseOrder
where $i/User = "EABEL"
return;

{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
) ttab;

•        substring() 提取输入字符串在其它一个字符串中的地方。

FOTiguan XML的嵌套查询

示例14:在演示12的查询结果中询问班老板联系电话

SELECT (
SELECT xmlTest.学号 AS '学生信息/@学号',
xmlTest.学生姓名 AS '学生信息/@姓名',
xmlTest.班级 AS '学生信息/@班级',
mainTeacher.姓名 AS '学生信息/班主任信息/姓名',
mainTeacher.教师编号 AS '学生信息/班主任信息/教师编号',
mainTeacher.性别 AS '学生信息/班主任信息/性别',
mainTeacher.年龄 AS '学生信息/班主任信息/年龄',
mainTeacher.联系电话 AS '学生信息/班主任信息/联系电话'
FROM xmlTest,mainTeacher
WHERE xmlTest.年级总分>=700
AND xmlTest.班主任=mainTeacher.姓名
FOR XML PATH('result'),TYPE).query('result/学生信息/班主任信息/联系电话') AS '优秀教师联系方式';

SELECT里面仍旧沿用了示范第13中学被套用的代码,外面用了query方法,查询结果如下图所示
乐百家数据库 15

<联系电话>15963002120</联系电话>
<联系电话>15963002120</联系电话>

概念五个XML变量

SELECT XMLQuery(
'for $i in $h//channel
return;

{$i/lastBuildDate}

{for $j in $h//item
where ora:contains($j, "PHP")
return  {($j/title, $j/link)}}

'
PASSING xmlparse (document httpuritype
('http://www.oracle.com/technology/syndication/rss_otn_news.xml').getCLOB()) as "h"
RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;

《XML数据类型的习性优化》(Performance Optimizations for the XML Data Type )

FOR XML AUTO

选择表名称作为成分名称,使用列名称作为品质名称,SELECT关键字前面列的相继用于XML文书档案的层系。
示例10:将Student表调换为XML格式(FO奥德赛 XML AUTO)
实践语句:

SELECT * FROM Student FOR XML AUTO;

询问结果如图所示
乐百家数据库 16
乐百家数据库 17

DECLARE @ClientList XML
SET @ClientList =
'<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>'
SELECT @ClientList
GO

XQuery 令你能够操作基于 XML 方式以及非基于情势的多少。以下示例演示了哪些利用 XMLTable 函数从 OE 演示数据库方式中询问基于 PurchaseOrder XML 方式的 XMLType 表。

•        XQuery规范是依照当前付出情状开展阐释,今后讲不定会发生变化。而SQL Server 二〇〇七是W3C工作草图所达成的安宁部分,不会产生变化。

创立索引

为表中有个别列创造索引,供给该列是XML数据类型。

ALTER TABLE Student
ADD xml_test XML;--对Student表添加一个XML数据类型字段xml_test
--对Student表的xml_test字段创建主XML索引,命名为学生信息表
CREATE PRIMARY XML INDEX 学生信息表
ON Student(xml_test)
GO
--对Student表的xml_test字段创建PATH辅助XML索引,记得写上主索引名
CREATE XML INDEX 辅助学生信息表
ON Student(xml_test)
USING XML INDEX 学生信息表 FOR PATH
GO

注:援助索引的命名不可能与主索引一样。

总结

 

咱俩大约掌握了XML在SQLServer 中的简单利用,从概念到利用形式。也来看了query()检索子集,也能选用value()检索独立的成分属性的值。当然除外还会有向exist(``) andnodes() 那样方法,合作语法都是利用,这一部分就不再实行讲了,如出一辙。有不明了的能够私聊。越来越多应用方法还请访谈MSDN来博取(寻找XQuery language reference)。

SELECT emps.empno,emps.ename, emps.sal FROM 
XMLTable(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
return;
$i'
COLUMNS empno NUMBER PATH '/EMPLOYEE/EMPNO',
ename VARCHAR2(30) PATH '/EMPLOYEE/ENAME',
sal NUMBER PATH '/EMPLOYEE/SAL') emps;

        <Boston>

FOR XML RAW

将表转变来成分名称是row,属性名称叫列名恐怕列的小名。
示例9:将Student表调换为XML格式(FO奥迪Q7 XML RAW)
Student表的数目如图所示
乐百家数据库 18
施行语句:

SELECT * FROM Student FOR XML RAW;

查询结果如图所示
乐百家数据库 19
乐百家数据库 20

 

在本文前边的询问 XMLType 数据部分中,您看来了一个有关使用 XQuery 将叁个XML 文书档案调换为另三个 XML 文书档案的身体力行。具体来讲,该示例使用 XQuery 表明式总计示例数据库形式 OE 的 purchaseorder 表中积攒的订单的订单一共,然后为拍卖的各种订单生成了一个 OrderTotal XML 元素。实际上,您可以运用 XSLT 实行同一操作。为此,您首先须求创设叁个施用于 PurchaseOrder XML 文书档案的 XSLT 样式表,以退换对应的 OrderTotal 成分。对于此示例,能够利用列表 4 中所示的 XSLT 样式表。

当安顿张开的询问在for变量和for语句体之间含有一个JOIN操作时,种类能够用XPath表明式表明,但会产生推行效能低,今年应该利用FLWO翼虎语句来定义该体系。独有当上面罗列条件中的二个仍然八个获得满意时,才符合采纳FLWO景逸SUV表明式。

XML查询技艺

XML文书档案以七个纯文本的款式存在,首要用来数据存储。不但有利顾客读取和使用,并且使修改和掩护变得更便于。

本条例子通过使用DECLARE  表明去定义名叫@ClientList 的变量,当自个儿表明变量的时候,只须求富含XML的数据类型的名字在变量名后。

http://localhost/employees/empsbonus.xml

演示:相比八个address节点的依次

XML索引

由于XML数据类型最大可存款和储蓄2GB的多寡,因而须要创立XML索引来优化查询品质。

注意:

因为XQuery是一种特别复杂的语言,大家只是提到了一有个别她的机件,假使想要更进一步的明亮它怎么行使,请查看MSDN XQuery language reference.

那大家现在先来因而例子来看一下query()和value 多个艺术是什么样选择XML数据的。需求小心的是小编接下去的测量试验情况是SQLServer二〇〇九Sportage2。实例中包括了ClientDB 数据库、ClientInfoCollection 的XML数据以及ClientInfo 表。

USE master;
GO

IF DB_ID('ClientDB') IS NOT NULL
DROP DATABASE ClientDB;
GO

CREATE DATABASE ClientDB;
GO

USE ClientDB;
GO

IF OBJECT_ID('ClientInfoCollection') IS NOT NULL
DROP XML SCHEMA COLLECTION ClientInfoCollection;
GO

CREATE XML SCHEMA COLLECTION ClientInfoCollection AS 
'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns="urn:ClientInfoNamespace" 
targetNamespace="urn:ClientInfoNamespace" 
elementFormDefault="qualified">
  <xsd:element name="People">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Person" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="FirstName" type="xsd:string" minOccurs="1" maxOccurs="1" />
              <xsd:element name="LastName" type="xsd:string" minOccurs="1" maxOccurs="1" />
              <xsd:element name="FavoriteBook" type="xsd:string" minOccurs="0" maxOccurs="5" />
            </xsd:sequence>
            <xsd:attribute name="id" type="xsd:integer" use="required"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>';
GO

IF OBJECT_ID('ClientInfo') IS NOT NULL
DROP TABLE ClientInfo;
GO

CREATE TABLE ClientInfo
(
  ClientID INT PRIMARY KEY IDENTITY,
  Info_untyped XML,
  Info_typed XML(ClientInfoCollection)
);

INSERT INTO ClientInfo (Info_untyped, Info_typed)
VALUES
(
  '<?xml version="1.0" encoding="UTF-8"?>
  <People>
    <Person id="1234">
      <FirstName>John</FirstName>
      <LastName>Doe</LastName>
    </Person>
    <Person id="5678">
      <FirstName>Jane</FirstName>
      <LastName>Doe</LastName>
    </Person>
  </People>',
  '<?xml version="1.0" encoding="UTF-8"?>
  <People xmlns="urn:ClientInfoNamespace">
    <Person id="1234">
      <FirstName>John</FirstName>
      <LastName>Doe</LastName>
    </Person>
    <Person id="5678">
      <FirstName>Jane</FirstName>
      <LastName>Doe</LastName>
    </Person>
  </People>'
);

Listing 1: 创立测验景况和数目

利用 XQuery,能够依照 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML 文档,无论其职分怎么:无论是存款和储蓄在数据库中、置于网址上、即时创造只怕存储在文件系统中。但要注意,Oracle XML DB 为针对数据库中存款和储蓄的数码开展的 XML 操作提供了丰盛高的性质和可伸缩性。由此,借令你能够完全调节所管理的数量,则最佳将它移动到数据库中。

 

FOR XML子句

经过在SELECT语句中利用FO揽胜极光XML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server 二零零六协助FO卡宴XML的多种格局,分别是RAW格局,AUTO方式,EXPLICIT方式和PATH情势。

若是应用程序管理关全面据而非 XML,而你要求拜望的多寡以 XML 格式存款和储蓄,则将 XML 分解为关周密据恐怕会拾贰分管用。继续开展上有个别的身体力行,您能够动用 SQL 函数 XMLTable 将职员和工人 XML 元素分解为设想表的单个列,如下所示:

') as Result

FOR XML PATH

PATH形式提供了一种较简单的艺术来混合成分及品质。在PATH格局中,列名或列别名被看做XPATH表明式来管理,这个表明式钦点了哪些将值映射到XML中。私下认可处境下,PATH方式为每同样自动生成

查询外部数据源

XPath1.0,是由W3C职业组定义,用于在单个XML文书档案中一定节点的言语。X帕特h1.0采纳基于路线的平整来标志XML文书档案中的节点。相同的时候它定义了XSLT 1.0和XPointer的着力准绳。X帕特h 1.0有管理字符串、布尔值和浮点数的内置函数。它定义了依附设置的过滤规范来过滤节点的语法。XPath 1.0正值进级为XPath 2.0以协理越多的类别项目,提供更加多的效率。XQuery 1.0基于对XPath 2.0,扩充了排序、重装、构形成效,並且落成了XPath2.0没能兑现的数码浏览和过滤方面包车型地铁习性。

OPENXML函数

OPENXML是一个行集函数,用于检索XML文书档案。在试用OPENXML函数从前,应当要先用系统存储进度sp_xml_preparedocument解析文书档案,该存款和储蓄过程在条分缕析完XML文书档案后会再次回到一个句柄,使用OPENXML检索文书档案时要将该句柄作为参数字传送给OPENXML。
示例15

--定义两个变量@Student和@StudentInfo
DECLARE @Student int
DECLARE @StudentInfo xml
--使用SET为@StudentInfo赋值
SET @StudentInfo='
<row>
<姓名>祝红涛</姓名>
<班级编号>2019382910</班级编号>
<成绩>89</成绩>
<籍贯>沈阳</籍贯>
</row>
'
--使用系统存储过程sp_xml_preparedocument分析由@Student变量表示的XML文档,将分析得到的句柄赋值给@Student变量
EXEC sp_xml_preparedocument @Student OUTPUT,@StudentInfo
--在SELECT语句中使用OPENXML函数返回行集中的指定数据
SELECT * FROM OPENXML(@Student,'/row',2)
WITH(
姓名 varchar(8),
班级编号 varchar(10),
成绩 int,
籍贯 varchar(20)
);

结果如图所示
乐百家数据库 21
在上述语句中,sp_xml_preparedocument存款和储蓄进度语句用了2个参数,个中@Student是贰个int型变量,该存款和储蓄进度会将句柄存款和储蓄在@Student变量中作为结果数据,@StudentInfo是一个XML类型的变量,存款和储蓄了将在举行解析的XML文书档案。
OPENXML函数的言辞中,使用了3个参数,当中@Student代表已经通过sp_xml_preparedocument存储进程解析的文书档案的句柄,’/row’使用XPath方式提供了二个路子,代表要回来XML文书档案中该路线下的数目行,2是多个可选数据参数,表示将那么些多少行以成分为骨干映射。

BEGIN
IF(DBMS_XDB.CREATEFOLDER('/public/employees')) THEN
DBMS_OUTPUT.PUT_LINE('Folder is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create folder');
END IF;
COMMIT;
END;
/
DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in 1
return (
{
for $i in ora:view("HR", "employees")/ROW
where $i/EMPLOYEE_ID <= 102
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string($i/LAST_NAME)}
{xs:integer($i/SALARY)}
)} )'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/employees.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/

 

没著名称的列

上面介绍一种简单的FOLAND XML PATH应用措施

SELECT 2 3 FOR XML PATH;--将2 3的值转换成xml格式

询问结果如图所示
乐百家数据库 22

注:假如提供了空字符串FO途睿欧 XML PATH(‘’)则不会变动任何因素。

SELECT 2 3 FOR XML PATH('');--将2 3的值转换成xml格式并去掉<row>

询问结果如图所示
乐百家数据库 23
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中成就>=700分的上学的小孩子的班CEO音信和学生新闻,并转化成XML格式
XmlTest表数据如下图所示
乐百家数据库 24
MainTeacher表数据如下图所示
乐百家数据库 25
进行下边包车型客车言语

SELECT xmlTest.学号 AS '学生信息/@学号',--@符号表示该名称为属性名,斜杠表示子层级
xmlTest.学生姓名 AS '学生信息/@姓名',
xmlTest.班级 AS '学生信息/@班级',
mainTeacher.姓名 AS '学生信息/班主任信息/姓名',
mainTeacher.教师编号 AS '学生信息/班主任信息/教师编号',
mainTeacher.性别 AS '学生信息/班主任信息/性别',
mainTeacher.年龄 AS '学生信息/班主任信息/年龄',
mainTeacher.联系电话 AS '学生信息/班主任信息/联系电话'
FROM xmlTest,mainTeacher
WHERE xmlTest.年级总分>=700
AND xmlTest.班主任=mainTeacher.姓名
FOR XML PATH('result');--将根目录名改为result

查询结果如下所示

<result>
  <学生信息 学号="20180105" 姓名="王婷" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>
<result>
  <学生信息 学号="20180109" 姓名="甄诚" 班级="高一3班">
    <班主任信息>
      <姓名>师从光</姓名>
      <教师编号>83928182</教师编号>
      <性别>男</性别>
      <年龄>28</年龄>
      <联系电话>15963002120</联系电话>
    </班主任信息>
  </学生信息>
</result>

正如本文此前(参阅使用关周详据创设 XML部分)介绍的自己要作为楷模遵从规则所示范,使用 fn:doc 特别简单直接。它获得表示消息库文件能源 (UEnclaveI) 的字符串并回到该 U科雷傲I 指向的文书档案。要询问 fn:collection XQuery 函数的效用,同一文件夹中至少应该八个音信库文件。假诺已经运转了列表 1中的代码,则已经创办了 /public/employees 新闻库文件夹并在里边蕴藏了 employees.xml 文件。由此,您将索要在该公文夹中足足更创制多个 XML 文件,然后技能试用 fn:collection。列表 2 中的 PL/SQL 代码基于 SCOTT/TIGELX570 演示数据库情势的 dept 和 emp 表存款和储蓄的关周详据构建XML,然后将转移的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees 音信库文件夹。要运行列表 2 中的 PL/SQL 进程,请保管以 SCOTT/TIGE本田UR-V的身份登陆。

含蓄在本文中的内容,代表了微软集团在那几个主题素材上风行的思想,直到正式发布软件甘休。因为微软必需依附市廛标准的变通做出响应,由此本文不应作为微软其它机关的答应,并且微软无法担保在正儿八经版本发表后,本文中其余音信的正确性。

涸泽而渔品质难题

XPath2.0简介

http://www.w3.org/1999/XSL/Transform" version="1.0">



























XML实例:

正如你以前面包车型地铁示范中打探到的,在 Oracle XQuery 实践中,doc 和 collection XQuery 函数用于访谈 Oracle XML DB 新闻库中储存的 XML 文书档案。可以经过 XMLTable 和 XMLQuery SQL 函数中的 PASSING 子句动态绑定外界数据源。考虑以下示例。假如你的营业所要为那个从事于 XQ 项指标职工付出奖金。由此,财务部公布了 empsbonus.xml 文件,在那之中含有有身份获得奖金的职工列表以及该列表中输入的种种职员和工人的奖金数目。empsbonus.xml 文件大概如下所示:

CREATE TABLE [MedicalRecords](

以上查询是叁个关于怎样行使 XQuery 基于 XML 和非 XML 数据(以不一致的章程从不相同的多寡源中检索)生成 XML 文书档案的示范。具体来说,使用 ora:view() 函数访问 HR 演示格局中的默许 employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于 HTTP 访谈 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return 子句中创设新的 XML 文书档案。最终,将赢得以下 XML 文书档案:

•        时间段、日期、时间的函数和操作符(functions and operators on durations, dates, and time): years-from-duration(), months-from-duration(), days-from-duration(), hours-from-duration(), minutes-from-duration(), seconds-from-duration(), year-from-date提姆e(), month-from-dateTime(), month-from-dateTime(), day-from-dateTime(), hours-from-dateTime(), minutes-from-dateTime(), seconds-from-dateTime(), timezone-from-dateTime(), year-from-date(), month-from-date(), day-from-date(), timezone-from-date(), hours-from-time(), minutes-from-time(), seconds-from-time(), timezone-from-time(), adjust-dateTime-to-timezone(), adjust-date-to-timezone(), adjust-time-to-timezone(), subtract-dateTimes-yielding-yearMonthDuration(), subtract-dateTimes-yielding-dayTimeDuration(), subtract-dates-yielding-yearMonthDuration(), subtract-dates-yielding-dayTimeDuration(). 类型xdt:dayTimeDuration 和 xdt:yearMonthDuration也不帮忙。

列表 2:基于关周密据创设 XML 并将其保存到 XML 新闻库

/Resume/Employment/Emp.OrgName/text()

SET AUTOTRACE ON EXPLAIN
SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder/User
where $i = "CJOHNSON"
return $i'
PASSING OBJECT_VALUE) ptab;

    <Name>KK Hospital</Name>

以上查询与本有的起始的 XMLTable 示例生成一样的出口。

在SQL Server 2007中,XQuery协理cast as TYPE ?操作符,能够成功显式类型转换。使用xs:TYPE()构造器也足以形成显式类型调换,何况写起来也比cast as TYPE ?操作符更简短。


100
King
24000


101
Kochhar
17000


102
De Haan
17000

XQuery应用场景

EMPNO ENAME SAL
----- -------------- ----------
7839 KING 5000
100 King 24000
101 Kochhar 17000
102 De Haan 17000

') as Result

接下去,假使您需求根据 empsbonus.xml 文书档案中积累的数码创制一个报表。在该报表中,您或然不只要含有列表中体现的奖金多寡以及各类员工的员工ID,还要满含他/她的人名。因而,能够率先使用以下查询生成七个新的 XML 文书档案(假使你以 H传祺/HXC60 的身份连接):

                element Level { $ED/RES:Edu.Level cast as xs:string? },

总结

 

询问 科雷傲SS 新闻提供

类型转变函数

但在支付实际应用程序时,您将很也许须要 XQuery 表达式直接生成 HTML 标志,实际不是一味转移叁个如上所示的 XML 文书档案。那样,您便能够营造三个更加灵活、可维护性越来越高的应用程序,原因是在这种情景下,所有中华VSS 管理(从提取须求的数码到将它包裹在 HTML 标志中)都将改换成数据库。那让你不要编写担当 福睿斯SS 处理的应用程序代码。实际上那象征你不要在举个例子 瑞鹰SS 新闻提供的结构早就改造的场馆下修改应用程序代码。相反,您只需修改用于 EvoqueSS 管理的 XQuery 表明式。

SELECT @Result.query('

SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder
where $i/User = "CJOHNSON"
return $i/User'
PASSING OBJECT_VALUE) ptab;
这次,输出应如下所示: 
COUNT(*)
----------
9
Execution Plan
---------------------------------------------------
Plan hash value: 3411896580
---------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 29 | 7 (0) | 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 29 | | |
| 2 | NESTED LOOPS | | 1 | 29 | 7 (0) | 00:00:01 |
| 3 | FAST DUAL | | 1 | | 2 (0) | 00:00:01 |
|* 4 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 29 | 5 (0) | 00:00:01 |
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter("PURCHASEORDER"."SYS_NC00022$"='CJOHNSON' AND
SYS_CHECKACL("ACLOID","OWNERID",xmltype('...

        Expression1 (

正文提供的演示不止示范了在哪儿下以及如何利用 XQuery 查询、构建和更换XML,何况还亲自过问了如何监督和深入分析 XQuery 表达式的品质实践,进而找到更火速的方法来管理同一专门的学问负荷。

        for $A in /RES:Resume/RES:Address

列表 3:使用绑定变量

                <Temp Date="2004-11-06" High="54" Low="41" />

将动态变量绑定到 XQuery 表明式

正如运算符

您曾在本文通晓到,XQuery 是一个综合的询问语言,它提供了一种用于查询、构建和转变 XML 数据的快速方法。就算 Oracle XQuery 施行使您能够操作任何能够用 XML 表示的数额(无论它存款和储蓄在数据库中、位于网址上或然存款和储蓄在文件系统中),但将管理的数据移动到数据库中一贯是三个不错的主张。对于数据库中积存的数额,Oracle XML DB(对 XPath 重写使用同一机制)只好眼看优化管理那多少个基于以下数据营造的 XQuery 表明式:这几个数量包括关周到据、对象-关周详据或应用结构化(对象-关系)存款和储蓄才能存款和储蓄的依照XML 格局的 XMLType 数据。

FROM [HumanResources].[JobCandidate]

列表 1:使用 ora:view 基于关周详据成立 XML

') as Result

DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in ora:view("SCOTT", "dept")/ROW
where $j/DEPTNO = 10
return ( 
{$j/DEPTNO,
$j/DNAME}
 {
for $i in ora:view("SCOTT", "emp")/ROW
where $i/DEPTNO = $j/DEPTNO
return (

{$i/EMPNO,
$i/ENAME,
$i/SAL}
)} 

)'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF(DBMS_XDB.CREATERESOURCE('/public/employees/acc_dept.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/

        </Skills> 

100
SKING
AD_PRES

                <Result>Nodes are equal</Result> 

该查询将转移以下输出:

您能够动用数据访谈函数来提取字符串或许类型化节点的值。XQuery补助二种档期的顺序的多少访谈函数:string()提取节点中的字符串值;data()提取类型化节点值。假设节点不是文本节点,不是性质节点,亦不是因秋天点,那么data()函数抛出二个景观错误。借使节点是二个非类型化XML实例的文书档案节点,那么data()重回文书档案的字符串值。要是节点是贰个复合类型元素,data()再次回到三个场所错误。

列表 4:使用 XSLT 计算小计总和 (Quantity * UnitPrice)

语法

XQuery 与 XSLT

WHERE Store.CustomerID = 4

Tue, 01 Nov 2005 19:37:42 GMT


http://www.oracle.com/technology/xe


http://www.oracle.com/technology/pub/articles/oracle_php_cookbook


http://www.oracle.com/technology/tech/php/zendcore/index.html

                <Temp Date="2004-11-06" High="55" Low="43" />

但在好几情状下,很难开掘 XQuery 表明式的哪些构造将使少数查询的习性更加好。那正是干吗最佳在开采阶段使用调解工具的源委。

 

100
1200


101
1000

SELECT Resume.query('

//File:BindVars.php
$user = 'hr';
$pswd = 'hr';
$db ='(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))
)
(CONNECT_DATA=(SID=orclR2)(SERVER=DEDICATED))
)';
$empno=100;
$conn = oci_connect($user, $pswd, $db);
$sql = 'SELECT XMLQuery('."'".'for $i in ora:view("employees")/ROW
where $i/EMPLOYEE_ID = $empno
return (
{$i/EMPLOYEE_ID,
$i/EMAIL,
$i/JOB_ID}
)'."'".'PASSING XMLElement("empno", :empno) AS "empno"
RETURNING CONTENT).GetStringVal() AS RESULT FROM DUAL';
$query = oci_parse($conn, $sql);
oci_bind_by_name($query, ":empno", $empno, 3);
oci_execute($query);
oci_fetch($query);
$str = oci_result($query, 'RESULT');
print $str;
?>

xs:TYPE实例

为访谈 Oracle XML DB 音信库中存放的 XML 数据,Oracle XQuery 引进了 fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML 音信库中存储的单个 XML 文书档案,而 fn:collection 令你能够访谈同一新闻库文件夹中存款和储蓄的八个 XML 文书档案。

•        Castable表明式能够检查确认叁个原子值是或不是可以转移为钦点的等级次序。技术方案—使用表明式“empty(data($x)) or not(empty(T($x)))” 代替“$x castable as T?”。

将 XML 分解为关全面据

引用:

另一种能够鲜明巩固 XQuery 表明式实施质量的技术是采用绑定动态变量。使用绑定变量(并非将变量串联为字符串)可以使 Oracle 重用 SQL 语句,进而减少深入分析开销并明显提升应用程序的特性。能够在 XMLQuery 和 XMLTable SQL 函数中使用 PASSING 子句将动态变量绑定到 XQuery 说明式。该本领使你能够依附顾客端代码中总括的参数动态生成 XML。列表 3 中的示例演示了如何在从 PHP 脚本推行的 XQuery 查询中接纳绑定变量。

最近SQL Server 二零零五中,XQuery不支持的风味如下:

该 XQuery 应生成二个 XML 文档,个中包括 Oracle 本事网 (OTN) 最近透露的与 PHP 工夫相关的头条音信列表。所生成的 XML 文书档案大概如下所示:

数量访谈

听闻关周到据营造 XML

FROM [HumanResources].[JobCandidate]

SELECT XMLQuery(
'for $k in 1
return (
 {for $i in ora:view("employees")/ROW,
$j in $emps/EMPLOYEES/EMPLOYEE
where $i/EMPLOYEE_ID = $j/EMPNO
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string(fn:concat($i/FIRST_NAME, " ", $i/LAST_NAME))}
{xs:integer($j/BONUS)}
)} )'
PASSING xmlparse (document httpuritype
('http://localhost/employees/empsbonus.xml').getCLOB()) as "emps"
RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;

        declare namespace RES="";

您能够看看,以上展现的询问生成同样的末尾结果,但它们的实践安插并差别样。查看最终一个示范中的 XQuery 表明式,您可能会小心到它迭代顶层 PurchaseOrder 成分,当中的每一个PurchaseOrder 成分都代表依据 PurchaseOrder XMLType 方式的表中的一整套。那意味实际上海重机厂写 XQuery 表明式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder 文档)中的行。与查询要迭代不意味基础表中的单个行的 XML 成分相比较,该措施的习性越来越好一些。

          element Skill { data($Skill) }

所选用的存款和储蓄模型并不是是震慑 XQuery 表达式实行品质的独一因素。在一些情况下,XQuery 表明式自个儿的组织也大概引致品质难点。要监察和控制 XQuery 表达式的品质,能够打印并检讨关联的 EXPLAIN PLAN。在 SQL*Plus 中,只需安装 AUTOTRACE 系统变量,就能够打印 SQL 优化程序行使的实践路线。但要实践该操作,请保管创制 PLUSTRACE 剧中人物,然后将其授予连接到数据库所采用的客商。有关怎样实践此操作的音讯,请参阅 Oracle 数据库 10g 第 2 版 (10.2) 文书档案中《SQLPlus 客户指南和参照》一书中的“调治SQLPlus”一章。以下示例演示了怎么通过检查 EXPLAIN PLAN 生成的实践陈设来赢得利润。若是你已经将 PLUSTRACE 角色赋予暗中认可顾客 OE,以 OE/OE 的地位登陆并运营以下查询:

XPath2.0简介

在列表 1 中的第4个 PL/SQL 进度中,您只是在 XML 新闻库中开创了多个新文件夹。在该音信库文件夹中,您随后将储存此处彰显的第三个PL/SQL 进程中创建的 XML 文书档案。第一个 PL/SQL 进度首头阵出 SELECT 语句,该语句使用 XMLQuery SQL 函数基于关周全据营造 XML。对于 XQuery 表明式(XMLQuery 在此间将其作为参数)来说,请留心嵌套的 FLWO翼虎表明式中行使的 ora:view XQuery 函数。在该示例中,ora:view 获取多少个输入参数,即“HEnclave”和“employees”,它们提醒该函数查询属于 HCRUISER数据库格局的职员和工人表。由此,ora:view 将回到三个象征 H卡宴.employees 表行的职工 XML 文书档案类别。但为了节省结果文书档案中的空间,只将前八个职员和工人记录传递给结果种类。那是经过在 FLWOQX56 表达式的 where 子句中钦命 $i/EMPLOYEE_ID <= 102 而落实的。请留心 FLWOCRUISER 表明式的 return 子句中运用的 xs:string()xs:integer() XQuery 类型表明式。实际上,此处使用的那多少个 XQuery 表明式不仅仅将 XML 节点值转变为相应的门类,而且还将领到那么些节点值。随后,生成的职员和工人 XML 文书档案作为 employees.xml 保存到后边在列表 1 中另一个 PL/SQL 进度中开创的 /public/employees XML 音讯库文件夹。要确定保障此操作已形成,可实行以下查询:

FROM [MedicalRecords]

上述查询将拍卖客商 EABEL 央求的保有订单(即存款和储蓄在 XMLType 的私下认可PurchaseOrder 表中的订单)并将转换与查询 XMLType 数据部分中的 XQuery 查询同一的出口。

                <Result>Selected node is an Element</Result> 

在其实际情境况中,以上的 XML 文件或许置于网址上(由此能够经过网络获取)、以文件方式积累在当麻芋果件系统中,或以文件财富情势储存在 Oracle XML DB 音讯库中。就本示例来说,该文件位于网址上。为轻便起见,能够在目录(Web 服务器在中间蕴藏可从 Web 看到的文书档案)中创立多少个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml 文件,以便能够透过以下 U凯雷德L 访谈 empsbonus.xml 文件:

在XML Schema 标准中对富有的内置类型定义了构造函数。这个构造函数不仅可以够组织类型化的值还是能开展类型转变。XQuery还足以用于为输入的schemas定义类型。

(网编:铭铭)

品种注脚表明式

那将扭转以下输出:

 

SELECT XMLQuery('for $i in /PurchaseOrder
where $i/User eq "EABEL"
return 
{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
RETURNING CONTENT)
FROM purchaseorder;

') as Result

那会儿,/public/employees 消息库文件夹应蕴涵三个文本:acc_dept.xml(由列表 2 中的 PL/SQL 代码生成)和 employees.xml 文件(由列表 1 中的代码生成)。由于这个 XML 文书档案存款和储蓄在同等音讯库文件夹中,由此能够选用 fn:collection 函数访问五个XML 文书档案中储存的职工音讯。然则,尽管这一个 XML 文书档案均隐含职员和工人 XML 成分(这几个因素实际上具备一样结构),但 XML 文书档案本身的构造迥然区别。在 employees.xml 中,文书档案根成分为 EMPLOYEES,而 acc_dept.xml 将 DEPARTMENT 用作根成分。要化解此主题素材,能够由此 XQuery 使用 XPath // 构造,进而导航到 XML 文书档案中的有些节点,而毋庸钦定该节点的熨帖路线。以下示例演示了什么在 XQuery 表明式中央银行使 XPath // 构造:

 

ORDERTOTAL
-------------------------------------------------------------

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92

•        Validate表明式在时下规模内,是把依照schema定义的标准有效化。实施方案—使用Transact-SQL转变schema collection,来替代利用validate表明式。

原文:Oracle XQuery查询、营造和转变XML 回到数据库首页

 

你能够观察,以上输出富含从 employees.xml 和 acc_dept.xml 中拿走的职工 XML 成分,那一个成分表示薪金大于或等于 5,000 美金的职员和工人。

引用:

鉴于 福特ExplorerSS 新闻提供精神上是多少个托管的 XML 文件(翼虎SS 新闻阅读器从中获得头条音讯或别的剧情),因而得以像管理别的其余能够由此Web 获得的 XML 文书档案那样来拍卖它。正如您在本文前面包车型大巴查询外界数据源部分中所见,能够接纳XQuery 查询其余能够经过 UMuranoL 访谈的 XML。您通过 XMLTable 和 XMLQuery SQL 函数中的 PASSING 子句动态绑定全部外界 XML 数据源。以下是贰个询问 RubiconSS 音讯提供的 XQuery 示例:

XQuery表达式的构造

查询 Oracle XML DB 音信库中的 XML 数据

                        <OrgName>ABC Technologies</OrgName>

列表 3 中显得的脚本应生成以下输出(注意,浏览器中只怕不会来得标志):

示例:使用"instance of xs:TYPE" 

SELECT XMLQuery(
'for $i in fn:collection("/public/employees")//EMPLOYEE
where $i/SAL >= 5000
order by $i/ENAME
return;
$i'
RETURNING CONTENT) FROM DUAL;

                        <EndDate>10/04/2004</EndDate>

在 Oracle 数据库 10g 第 2 版中,Oracle 引进了叁个与该数据库集成的专职能自带 XQuery 引擎,该引擎可用来完毕与开拓协助 XML 的应用程序相关的各样职分。XQuery 是一种用于拍卖 XML 数据模型的查询语言,它实际上可操作任何项目标可用 XML 表明的多少。就算 Oracle XQuery 实践令你能够动用数据库数据和外界数据源,但在拍卖数据库中积攒的结构化数据方面,Oracle XML DB 经常能够鲜明拉长质量。

FROM [HumanResources].[JobCandidate]


100
Steven King
1200


101
Neena Kochhar
1000

          {

该查询应生成以下输出:

') as Result

就算 Oracle 在 Oracle XML DB 中提供了八个自带 XSLT 管理器,但在非常多动静下(尤其是在管理大型文书档案时),XQuery 对于创设 XML 越来越高速。其余,XQuery 表明式平常比为同一作业设计的 XSLT 样式表更具可读性,并且更精晓。与 XSLT 同样,XQuery 不但可用以将三个 XML 文书档案调换为另二个 XML 文书档案,何况还可用来将 XML 转变为另一种基于文本的格式,如 HTML 或 WML。

 

你只怕对为上述查询生成的奉行安插并不顺心。特别是,所拍卖的行数或然那一个大。由于 SQL 调治的严重性对象是幸免访问对结果未有任何影响的行,由此或许要三番两次调治查询以优化质量。对查询中蕴藏的 XPath 表明式实行再度建立模型后,能够重新重试它,如下所示:

                <Temp Date="2004-11-02" High="56" Low="42" />

查询 XMLType 数据

 

正如您从后边的片段中打听到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的 XML 内容的敏捷方法 - 无论你是拍卖地点存储的 XMLType 数据或然查询基于关周全据营造的 XML 视图。但听闻对数码应用的储存类型的例外,XQuery 表达式的施行品质或者天冠地屦不相同。特别是,Oracle XML DB 能够优化基于由 ora:view 函数创设的 SQL/XML 视图而构建的 XQuery 表明式。对于 XMLType 表或列中蕴藏的 XML 数据,只可以对应用结构化(对象-关系)存款和储蓄本事存款和储蓄的根据XML 情势的 XMLType 数据开展 XQuery 优化。

                element GPAScale { data($ED/RES:Edu.GPAScale) }

要收获同等的末梢结出,能够改用 XMLQuery 函数。但即使将上贰个演示中接纳的 XQuery 表明式参数字传送递给 XMLQuery(如下所示):

SELECT Resume.query('

在上述 XQuery 中,fn:doc XQuery 函数用于访谈 Oracle XML DB 音讯库中存放的单个 XML 文书档案。但一旦要拍卖部分有着同等或一般结构的 XML 文档(存款和储蓄在同一 XML 音信库文件夹中),应该咋办?这种景色下,另一个用来拍卖 XML 信息库财富的 XQuery 函数(即 fn:collection)只怕会派上用场。本文稍后将介绍多少个关于如何利用 fn:collection XQuery 函数的身体力行。

SELECT Resume.query('

SELECT XMLQuery('for $i in /PurchaseOrder
return 
{$i/Reference}

{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity*$j/@UnitPrice))}

'
PASSING OBJECT_VALUE
RETURNING CONTENT) AS ordertotal
FROM purchaseorder
WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User = "EABEL"]') = 1;

您可以动用insert关键字在XML文书档案中插入两个节点。Insert关键字接受XQuery表明式标记的待插入的节点,并辅助XQuery表明式来标志插入地点的参照他事他说加以考察节点。

SELECT XMLTRANSFORM(OBJECT_VALUE,
xdbUriType('/public/orderTotal.xsl').getXML()).GetStringVal() AS RESULT FROM
purchaseorder WHERE existsNode(OBJECT_VALUE, 
'/PurchaseOrder[User = "EABEL"]') = 1;

 

在要求的情状下(比如,向 Web 服务发送结果),您也许要依照关周全据构建XML。要在 Oracle 数据库 10g 第 2 版此前的版本中做到此职责,平日须求使用 SQL/XML 生成函数,如 XMLElement、XMLForest 和 XMLAgg()。在 Oracle 数据库 10 g 第 2 版中,XQuery 将比这一个函数更为便捷。具体来讲,在 XQuery 表明式内部使用 ora:view XQuery 函数,您可以查询现成的关系表或视图以及当时塑造XML,进而没有需要经过关周密据显式成立 XML 视图。列表 1 中的 PL/SQL 代码演示了怎么着利用 ora:view 基于示例数据库格局 H昂Cora的暗许员工涉嫌表中寄放的数目营造 XML 文书档案。

        <Address>      

                <JobTitle>Software Engineer</JobTitle>

          element Employer

值类型构造器

Delete关键字能够在XML文档中剔除几个节点。Delete关键字接受在XML文书档案中除去使用XQuery表达式标记的三个节点。

SQL Server 2006当下的版本只帮衬Unicode codepoint的重新整建。

        <NewYork>

导言

          {

   Expression2

•        在查询语句的嵌缀部分,可以钦点静态的上下文节点(举个例子命名空间的绑定前缀namespace prefix bindings)。

《微软SQL Server 2005对XML的支持》(XML Support in Microsoft SQL Server 2005)

') as Result

') as Result

•        在FLWO福睿斯语句中追加了let语句,它能够钦定表明式的结果以贯彻越来越多的行使(SQL Server 2005中不补助)。

        <Education>Element count is { count(/RES:Resume/RES:Education) }</Education>,

SQL Server 二〇〇五通过内置XML数据类型支持XML数据的本地化存款和储蓄。XQuery 1.0本子是经World Wide Web Consortium (W3C) XML查询职业组定义,基于XML数据的公式化查询语言。XQuery,像SQL同样,是一种注解性的询问语言,宛就像大家在底下的稿子中校拜候到的等同,能因而着力的SQL和XPath知识来轻便地掌握它。

WHERE JobCandidateID = 3

WHERE JobCandidateID = 3

•        ns 是命名空间前缀。

') as Result

WHERE JobCandidateID = 3

                <Country>US</Country>      

上边包车型地铁表和XML文书档案举个例子说明了在病例场景中XQuery的利用。

') as Result

上面包车型客车询问利用常量表明式构造了某应聘者的四个历史职业的XML结构。

        </Employement>

表 2  axes缩写语法

上边的询问得出了独具StartDate大于xs:date类型构造的值的Employment节点:

 

示例:使用contains()函数

        <Asset>

          {

        where xs:decimal($ED/RES:Edu.GPA) gt 3.5 

逻辑操作符

WHERE PatientRecord.exist('/PatientRecord/ProblemDetails/Symptoms/Symptom/text()[contains(.,"Fever")]') = 1

详尽内容,查阅“微软SQLserver二〇〇七 XML最棒实行”白皮书。

        return 

        $A 

        [JobCandidateID] [int] IDENTITY(1,1) NOT NULL,

上边的询问再次来到了富有得到商业专门的学业余大学学生学位的应聘者的简历:

                element GPA { $ED/RES:Edu.GPA cast as xs:decimal? },

        for $EMP in /RES:Resume/RES:Employment

 

,

        then

WHERE JobCandidateID = 2

SET @result = '<Result />'

        /RES:Resume/RES:Address[last()]

 

上面包车型客车查询检查分明贰个用xPath表明式标记的address节点的品类是不是是element()类型:

') as Result

•        相比运算

                <Temp Date="2004-11-03" High="60" Low="40" />

        </Boston>

        for $ED in /RES:Resume/RES:Education

order by

        </WeatherInfo>

Return语句,和SQL中的SELECT语句看似,能够钦命询问的结果。你能够在return语句中应用另外三个管用的XQuery表明式。你同一也得以由此在return局地中注脚成分的构造、属性等来组织XML结构。

          element OS { data(/AssetInfo/SystemInfo/OS) }

XQuery内置函数

FROM [Sales].[Store]

乐百家数据库 26

          <PrescriptionDetails>

        <Symptoms>

        for $EMP in /RES:Resume/RES:Employment

                element NumberOfEmployees { string((/ST:StoreSurvey/ST:NumberEmployees)[1]) },

DECLARE @Weather xml

        WHERE JobCandidateID = @JobCandidateID

FROM [HumanResources].[JobCandidate]

FROM [Assets]

 

本文介绍了SQL Server 二零零五力所能致辅助的XQuery的各方面特色如FLWOOdyssey语句,XQuery的操作,if-then-else结构,XML的构造函数,XQuery的停放函数,类型的转变操作符,并举个例子表明了上述XQuery作用的利用和操作。本文同一时候也对SQL Server 二〇〇六所不能够补助的XQuery的性状开展领会析批评,并提议了事实上中国人民解放军海军事工业程高校业作中的技术方案。在本文的末尾章节中,详细举个例子介绍了三种特定的XQuery应用场景。

 

        where contains($Skill, "ASP.NET")

        for $ED in /RES:Resume/RES:Education

上面包车型客车查询利用sum()和count()函数总结了London和达拉斯的周周平均最高和最低的温度。

SELECT Resume.query('

 

          </Employer>

集中函数输入多个节点类别,然后回来种类的集中值。在SQL Server 2006中,XQuery最近辅助的会集函数是count()、min()、max()、avg()和sum()。当中,独有接济gt操作的品类(i.e.、多少个放置算数基本项目、日期类型、xs:string、xs:boolean和xdt: untypedAtomic)技能采纳min()和max()函数。八个函数不帮衬混合类型的行列。更上一层楼,xdt:untypedAtomic被以为是xs:double类型。

        @JobCandidateID [int],

Example: Updating a skill

DECLARE @Weather xml

•        Treat as表明式能够将表明式重返的静态类型转变为钦命的静态类型,并且当表明式的回来静态类型与钦点静态类型不相配时,会报贰个静态类型错误。它无法转变表明式重返的动态类型或然值。施工方案—无。

return sum($i $j)

FROM [HumanResources].[JobCandidate]

        $ED 

                <Temp Date="2004-11-05" High="52" Low="36" />

          element EMail { data($PA/Employee/EMailID) },

        return 

XML数据类型的方式

        for $EMP in /RES:Resume/RES:Employment

使用XQuery构造XML

          <Employment>

                <Company>Blue Cross Blue Shield</Company>

•        数学生运动算

        for $ED in /RES:Resume/RES:Education

SELECT Resume.query('

                <Skill>ASP.NET</Skill>      

FLWOKuga语句组成了XQuery表明式的着入眼,它与SQL的SELECT语句很相像。FLWOMurano(发音同“flower”)是FO索罗德, LET, WHERE, O哈弗DELX570 BY, RETUEvoqueN的缩写。XQuery的FLWO奥迪Q7表达式能够开展重复注明、变量绑定、过滤、排序以及重临结果的操作。SQL Server 200第55中学援救FO奥迪Q5, WHERE, O本田CR-VDE昂科威 BY和 RETUKugaN:

•        退换各类(order):使用order by语句来改造“empty greatest | least”顺序是不辅助的。

SQL Server 2005支撑对存款和储蓄在数据库中的XML数据开展改造。近期,W3C XQuery职业草图还没有为XML文书档案的改变定义三个规范。为了提供修改XML文书档案的支撑,微软研发了XML数据修改语言(XML Data Modification Language  DML)。XML文档能够动用XML数据类型的modify方法修改,并且能够采纳XML DML语句内定修改。

Axis表达了移动的趋势,和上下文节点的关系。SQL Server二〇〇六中扶助的axes是child, descendant, parent, attribute, self 以及descendant-or-self。

•        Built-in functions:这几天在SQL Server 2006中,还不扶助下边列举的放权函数。关于这个函数的越多内容,参见网址W3C.org的《XQuery 1.0和XPath 2.0的函数与操作符》(XQuery 1.0 and XPath 2.0 Functions and Operators)。

XQuery入门

        Expression2 )

        [PatientRecord] [xml] NOT NULL,

                <BachelorDegree>BS</BachelorDegree>      

引用:

 

        return

 

        return 

                <Skill>SQL</Skill>      

GO

 

          }

SELECT AssetID, AssetDetails.query('

                <Temp Date="2004-11-07" High="56" Low="44" />

 

XQuery的应用领域

显式类型转变

SELECT Resume.query('

                attribute Organization { $EMP/RES:Emp.OrgName },

                element Name { sql:column("Store.Name") },

                <Address2>Apt 3344</Address2>      

提到项目表明式

                <Temp Date="2004-11-07" High="56" Low="44" />

modify()方法能用来对一个XML文书档案的内容实行修改。它援救XML DML语句,进而完毕在三个XML实例中插入、更新只怕去除三个或四个节点。当它遇到一个NULL值时,它会报错。

        if ( (/RES:Resume/RES:Address)[1] instance of element() )

                element GPAScale { $ED/RES:Edu.GPAScale cast as xs:decimal? }

 

          <Employer IndustryCategory="ITServices">

        <Address>Element count is { count(/RES:Resume/RES:Address) }</Address>

') as Result

') as Result

关联二个XML数据类型的XML schema集能被以下的涉嫌引擎使用:

•        :: 是 axis 的分隔符。

                <Temp Date="2004-11-03" High="60" Low="40" />

除此以外,你仍是可以选拔into, after和before关键字来标志相对于参照节点的新节点的地方。当你使用into关键字,新节点将作为参照节点的子节点被插入。如若你包蕴into关键字,你还要要采用as first或然as last关键字来标志插入节点的地点和参照节点的当前子节点的职责关系。你能够使用after和before关键字将新节点作为参照节点的同级节点插入参照节点后要么前的职位。

        UPDATE [CandidateInfoXMLDataType]

SET @Weather = '

•        提供组织新节点的效果与利益。

好几应用需求依附行集来协会XML。在劳务器端,XML的结构能够通过FOHavalXML语句或然XQuery构造器可能操作XML DML。推荐使用FOGL450XML和XQuery构造器来布局XML的来头如下:

WHERE JobCandidateID = 2

Where

FROM [HumanResources].[JobCandidate]

FROM [Sales].[Store] Store 

                else

SELECT Resume.query('

顶尖实施的愈来愈多内容,参见Microsoft Developer Network (MSDN)的《XML在微软SQL Server 二〇〇七上的特级施行》(XML Best Practices for Microsoft SQL Server 二零零五)和《XML数据类型的最好应用》(Performance Optimizations for the XML Data Type)

摘要

在本文中,关于在编排XQuery1.0语言时须求非常注意的地点:

  <HospitalDetails>

在劳务器端使用XQuery的亮点

') as Result

WHERE JobCandidateID = 3

                <ID>D8456798</ID>

相对来说起在客商端管理XML进程,在劳动器端使用XQuery来管理XML进程要具有更加的多的独到之处。个中一部分优点能够总计如下:

•        不援助从表面导入schema。

) ON [PRIMARY]

                { $EMP/RES:Emp.JobTitle }

                <Temp Date="2004-11-04" High="51" Low="47" />

WITH XMLNAMESPACES( '' AS  "RES")

下面的询问利用count()函数得出了文书档案中employment、education和address节点的数额。

FROM [HumanResources].[JobCandidate]

 

                <MiddleName></MiddleName>      

WHERE JobCandidateID = 3

正如运算符

        declare default namespace  "";

        for $ED in /RES:Resume/RES:Education

        for $ED in /RES:Resume/RES:Education

 

query() 方法带领三个对若干个XML节点求值的XQuery表明式,允许顾客查询二个XML文书档案中的段落。那几个艺术的再次回到值一个非类型化XML文件类型的值。

演示:选拔GPA超越3.5的辅导背景

                then

    <DateDischarged>2004-05-08</DateDischarged>

XQuery构造器 vs. FOR XML语句

                <Temp Date="2004-11-07" High="58" Low="47" />

WHERE JobCandidateID = 2

上面包车型客车查询比方表明了contains()函数的用法,查询展现Edu.Degree节点成分值中包蕴字符串science的应聘者的引导消息。

利用instance of能够识别XML文书档案中单个节点的类型。

•        越发安全:唯有当使用顾客端XML进度时才把顾客端需求的多寡传递到顾客端,制止在互联网上传输完整数据而带来的高危机。

下边包车型大巴询问为JobCandidateID等于3的应聘者创设了八个XML文档,其数据选自该应聘者的Education节点:

XQuery的应用领域

•        当您要动用for语句的回来结果来定义重临结果集的档期的顺序时,使用return语句能够兑现。

XQuery的优点

现行反革命,让大家只要音讯本领部门安插选用预装了微软Windows® XP 和微软 Office 两千软件的Computer种类。下边包车型大巴询问选用了预装了Windows XP 和 Office 2000的硬件设备列表。

严守全数适用的版权法是客商的白白。在不限制版权法所规定权利的前提下,未经微软公司显著的书皮许可,不得以任何指标、任何款式或任何手腕(电子、机械、影印、录像或其余手腕)对本文书档案的任何部分实行理并答复制、积攒或引进检索系统、或传播。

                element GPA { xs:decimal($ED/RES:Edu.GPA) },

CREATE TABLE [CandidateInfoXMLDataType]

                <Result>Nodes are not equal</Result> 

聚拢函数

铺排操作

/* Stored procedure to insert a new skill element for a candidate */

示例:使用“cast as TYPE ?”操作符

        [ModifiedDate] [datetime] NOT NULL DEFAULT (getdate())

引用:

只有另作表达,否则文中描述的小卖部、组织、产品、域名、电子邮件地址、Logo、人士、地方和事件都以兴妖作怪的,无意联系或暗指与另外实际的公司、组织、产品、域名、电子邮件地址、Logo、职员、地方和事件有所关联。  

 

                <City>Redmond</City>

SELECT JobCandidateID, Resume

本文由乐百家数据库发布,转载请注明来源:转发--SQL Server 二零零七的XQuery介绍