XML 在SQLServer中的使用

XML 在SQLServer中的使用

XML查询手艺

XML文书档案以二个纯文本的样式存在,主要用以数据存款和储蓄。不但便宜用户读取和使用,而且使修改和掩护变得更便于。

 

原稿地址:

在 Oracle 数据库 10g 第 贰 版中,Oracle
引进了1个与该数据库集成的专职能自带 XQuery
引擎,该引擎可用于落成与付出援救 XML 的应用程序相关的各样任务。XQuery
是一种用于拍卖 XML 数据模型的询问语言,它实际上可操作任何项目标可用 XML
表达的多寡。固然 Oracle XQuery
推行使您能够应用数据库数据和表面数据源,但在拍卖数据库中存储的结构化数据方面,Oracle
XML DB 平常能够鲜明加强质量。

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));

在上头的演示中,column二列是XML数据类型列。
示例3:无法将XML数据类型列设置为主键或外键

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

试行上边包车型地铁代码,报错如下:
消息1919,级别16,状态1,第1 行
表’t一’ 中的列’column2′ 的连串无法用作索引中的键列。
消息1750,级别16,状态0,第1 行
胸中无数创设约束。请参阅前边的失实新闻。
XML数据类型的选用范围
唯有STMuranoING数据类型能力转换到XML。
XML列无法利用于GROUP BY语句中
XML数据类型存款和储蓄的多少不可能超过二GB
XML数据类型字段无法被设置成主键大概外键或称为其1部分。
Sql_variant数据类型字段的行使无法把XML数据类型作为种子品种。
XML列不能够钦赐为唯一的。
COLLATE子句不能被使用在XML列上。
存款和储蓄在数据库中的XML仅帮衬12八级的层次。
表中最对只好具备310个XML列。
XML列不能够进入到规则中。
唯一可应用于XML列的松手标量函数是ISNULL和COALESCE。
不无XML数据类型列的表无法有一个超越1伍列的主键。

SQL
Server对于XML扶助的主干在于XML数据的格式,这种数据类型能够将XML的数额存款和储蓄于数据库的目的中,比如variables,
columns, and
parameters。当你用XML数据类型配置那一个目的中的1个时,你钦赐项目标名字就好像您在SQLServer
中钦命三个类型同样。

正文提供的言传身教不仅示范了在如何地方下以及怎样运用 XQuery 查询、构建和更换XML,而且还出现说法了何等监督和分析 XQuery
表达式的品质实践,从而找到更加高效的章程来拍卖同壹职业负荷。

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

能够创立xml类型的变量,参数和列,或然将XML框架结构集合和xml类型的变量、参数或列关联,这种意况下,xml数据类型实例称之为类型化xml实例。不然XML实例称为非类型化的实例。

XML的数据类型确定保障了你的XML数据被完全的塑造保存,同时也适合ISO的正统。在概念1个XML数据类型在此以前,大家先是要知道它的二种范围,如下:

 

据他们说关周密据创设 XML

XML数据类型方法

XML数据类型共有四种方式
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>的子元素

询问结果如图所示
图片 1
点击查询结果
图片 2
如想询问标签

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

结果如图所示
图片 3

注:exsit()方法的参数不必做精显明位

Value():总计多少个询问并从XML中回到叁个简练的值(只可以回到单个值,且该值为非XML数据类型)。
Value()方法有二个参数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

查询结果如图所示
图片 4

注:SQLType不可能是XML数据类型,公共语言运维时(CL瑞虎)用户定义类型,image,text,ntext或sql_variant数据类型,但足以是用户自定义数据类型SQL。

Modify():在XML文书档案的贴切地方实施1个修改操作。它的参数XML_DML代表1串字符串,依据此字符串表达式来更新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 '插入节点后信息'

询问结果插入节点后信息如图所示
图片 5

注: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

查询结果如下图所示
图片 6

  • 多个实例的XML列不能够包括超越贰GB的数额。
  • 3个XML的列无法是索引。
  • XML对象不可能应用Group By的子句中。
  • XML的数据类型不援助相比和排序。

引用:

在要求的情景下(例如,向 Web 服务发送结果),您或然要依据关系数据构建XML。要在 Oracle 数据库 10g 第 2版在此以前的版本中成就此职责,经常需求动用 SQL/XML 生成函数,如
XMLElement、XMLForest 和 XMLAgg()。在 Oracle 数据库 十 g 第 2版中,XQuery 将比那一个函数更为赶快。具体来说,在 XQuery 表明式内部使用
ora:view XQuery 函数,您能够查询现成的涉嫌表或视图以及立即创设XML,从而不必经过关周到据显式创制 XML 视图。列表 一 中的 PL/SQL
代码演示了何等利用 ora:view 基于示例数据库方式 H本田UR-V的暗中认可职员和工人涉嫌表中蕴藏的数额创设 XML 文档。

XQuery简介

XQuery是一种查询语言,能够查询结构化只怕半结构化的数据。SQL Server
2008中对XML数据类型提供了帮衬,能够存款和储蓄XML文书档案,然后利用XQuery语言进行询问。

概念五个XML变量

摘要

列表 壹:使用 ora:view 基于关周密据创立 XML

FOR XML子句

透过在SELECT语句中采纳FO陆风X8XML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server
2008支持FORubiconXML的多种格局,分别是RAW格局,AUTO格局,EXPLICIT形式和PATH情势。

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

正文介绍了SQL Server
2006能够帮衬的XQuery的各方面特点如FLWORAV4语句,XQuery的操作,if-then-else结构,XML的构造函数,XQuery的放权函数,类型的改变操作符,并举例表明了上述XQuery效率的运用和操作。本文同时也对SQL
Server
二〇〇五所不可能帮助的XQuery的特点开始展览领悟析议论,并建议了实在工作中的化解方案。在本文的末梢章节中,详细举例介绍了二种特定的XQuery应用场景。

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;
/
FOR XML RAW

将表转换到成分名称是row,属性名称叫列名可能列的别称。
示例9:将Student表转变为XML格式(FOLAND XML RAW)
Student表的数目如图所示
图片 7
奉行语句:

SELECT * FROM Student FOR XML RAW;

询问结果如图所示
图片 8
图片 9

本条事例通过运用DECLARE  证明去定义名称为@ClientList
的变量,当自个儿注脚变量的时候,只供给包罗XML的数据类型的名字在变量名后。

引用:

在列表 一 中的第二个 PL/SQL 进程中,您只是在 XML
新闻库中开创了2个新文件夹。在该新闻库文件夹中,您随后将积存此处显示的第一个PL/SQL 进程中创立的 XML 文书档案。第叁个 PL/SQL 进度首头阵出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周到据构建 XML。对于 XQuery
表达式(XMLQuery 在那里将其视作参数)来说,请留心嵌套的 FLWOTiguan表明式中使用的 ora:view XQuery 函数。在该示例中,ora:view
获取多个输入参数,即“H景逸SUV”和“employees”,它们提示该函数查询属于 H奥迪Q5数据库形式的职员和工人表。因而,ora:view 将重返2个表示 HEnclave.employees
表行的职员和工人 XML
文书档案种类。但为了节省结果文书档案中的空间,只将前多个职员和工人记录传递给结果类别。那是通过在
FLWOLX570 表明式的 where 子句中内定 $i/EMPLOYEE_ID <= 102
而达成的。请小心 FLWOLAND 表明式的 return 子句中央银行使的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的那四个 XQuery
表明式不仅将 XML
节点值调换为相应的品类,而且还将领到那些节点值。随后,生成的职工 XML
文书档案作为 employees.xml 保存到前边在列表 一 中另二个 PL/SQL 进度中开创的
/public/employees XML 消息库文件夹。要保障此操作已产生,可进行以下查询:

FOR XML AUTO

使用表名称作为元素名称,使用列名称作为品质名称,SELECT关键字后边列的顺序用于XML文书档案的层系。
示例10:将Student表转变为XML格式(FO途达 XML AUTO)
进行语句:

SELECT * FROM Student FOR XML AUTO;

查询结果如图所示
图片 10
图片 11

本身设定了变量的值,然后使用select
来找出这么些值。和我们想的同等,它回到了XML的文档。如下:

情节目录

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

同意用户显式地定义XML树的形状,不受AUTO方式中的各个限制。不能够将FOCRUISER XML
EXPLICIT直接用在SELECT子句中。
示例11:将xmlTest表转变为XML格式(FO揽胜极光 XML EXPLICIT)
XmlTest表的数目如图所示
图片 12

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,不能漏掉,否则结果会以表格形式显示

询问结果如图所示
图片 13
图片 14
在结果图中我们发现,红框中一个班级信息列在一同,而持有学生都列在高壹三班下,那不是我们想要的结果,大家期望每一种班级对应自身的学员。那么怎么样搞定此类主题材料吧,这提到到排序。

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

第三删除代码行末的FOBMWX三 XML
EXPLICIT语句,仅仅施行剩下的一些,使结果以表格情势显示,那么结果如下
图片 15
这一个表格每行的依次也意味了该表格转化为XML文书档案后内容展现顺序。图中层级二(TAG=贰)的几行,地方都在一同,那也正是怎么层级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;

相对来说第3次代码,大家发现上边的代码不止在行末对数码按成分属性进行了排序,还在赋值的代码中有着改动。在层级一代码中全然未有改变,因为层级①的代码成效是安夸口ML格式的,对数据排序未有影响。在上面几个层级的赋值部分,各类层级的代码中都对地点多少个层级的成分重复赋值,那样做使结果的表格中不再有那么多属性值是NULL,能够便宜排序。最终再依照成分[班级音讯!2!班级]和[学员消息!3!学号!Element]排序。让我们看看结果怎么着。
运作方面包车型客车代码,但不运维FOMurano XML
EXPLICIT语句,看看表格中数量内容和行顺序是不是改动
图片 16
如图所示,发现行反革命数据和学习者数量的各种展现正确。运转具有代码获得XML文书档案,结果如图所示
图片 17
是因为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表,看看种种班级和它下属学生的层级关系是或不是有误。

注:写FOLAND XML
EXPLICIT代码要专注,层级一的代码中先安装层级结构,不要先急着赋值。在下边层级的代码中对层级1中的代码举办赋值,最佳重复赋值,否则就会出现文中的排序难点。假若有些层级出现重复数据,在该层级的代码前加DISTINCT关键字。消除排序难题最棒的诀借使对各种层级的习性重复赋值并在结尾用ORDER
BY按层级属性排序。

有心人调查地点的XML文书档案,发现总分属性的值是个float类型,要把它调换来int,只必要把层级三中对总分的赋值代码改成CAST(年级总分
AS int)
图片 18

<!-- 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>

导言

该查询应生成以下输出:

FOR XML PATH

PATH格局提供了壹种较轻巧的点子来混合元素及质量。在PATH格局中,列名或列小名被看做XPATH表明式来处理,这个表达式内定了哪些将值映射到XML中。暗中同意情况下,PATH形式为每同样自动生成

 

SQL Server 二零零七中的XML数据类型


100
King
24000


101
Kochhar
17000


102
De Haan
17000
从不名称的列

上面介绍1种简易的FO汉兰达 XML PATH应用措施

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

查询结果如图所示
图片 19

注:要是提供了空字符串FOCRUISER XML PATH(‘’)则不会变卦任何因素。

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

查询结果如图所示
图片 20
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中战表>=700分的学童的班COO消息和学生消息,并转载成XML格式
XmlTest表数据如下图所示
图片 21
MainTeacher表数据如下图所示
图片 22
施行上面的说话

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的列

在上边包车型地铁例证中,作者将开创三个合营社客户的表,表中存储了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文书档案插入了进入,然而它是被当做2个纯净的值插入到表列里面来。

正如以上所述,创设和插入都以很直接省略的,接下去大家看一下怎么样创立2个XML的参数

概念3个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().

在那此前大家要精晓1种说明式,正是XQuery,它是壹种庞大的脚本语言,用来赢得XML的数额。SQLServer
补助那种语言的子集,所以我们能动用那种语言的表达式来搜寻和修改XML的数据。

项目化vs.非类型化的XML数据类型

在上述 XQuery 中,fn:doc XQuery 函数用于访问 Oracle XML DB
新闻库中存款和储蓄的单个 XML 文书档案。但假设要处理局地兼有同样或貌似结构的 XML
文书档案(存款和储蓄在同1 XML
消息库文件夹中),应该如何做?那种景况下,另八个用于拍卖 XML
新闻库能源的 XQuery 函数(即
fn:collection)大概会派上用场。本文稍后将介绍多少个有关怎么样行使
fn:collection XQuery 函数的言传身教。

TYPE命令

SQL Server帮助TYPE命令将FO凯雷德 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表

查询结果如图所示
图片 23
双击展开查看XML

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

因为XQuery是壹种万分复杂的语言,大家只是提到了一局地她的零件,如若想要更进一步的明亮它怎么采纳,请查看MSDN XQuery
language
reference.

这大家今后先来通过例子来看一下query()和value
三个法子是怎么运用XML数据的。须求小心的是自己接下去的测试环境是SQLServer二〇〇九Highlander二。实例中蕴藏了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: 制造测试环境和多少

XML数据类型的章程

查询 XMLType 数据

FO中华V XML的嵌套查询

示例14:在演示1贰的询问结果中询问班高管联系电话

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里面依然沿用了演示1三中被套用的代码,外面用了query方法,查询结果如下图所示
图片 24

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

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 三: 结果集再次来到了/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列,然后你运维这一个讲话,就会赢得结果如Listing伍

<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 八: 这些结果集是类型化数据的结果

若是大家打算去赢得钦赐的<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为123四非类型化数据结果重临值。

对于类型化的列,笔者使用的id为567捌.留意,这一次不再供给在性质名称前拉长命名空间的前缀了,只需求在要素名字前引述就丰盛了。

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

Listing 1一: id为567八的数量结果

更进一步的显得结果,向下一流

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>

Listing 1肆: 名字的结果的展现

本来仍可以透过数字索引的点子呈现:

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 1伍: 使用数字索引来引用成分下的结果

XQuery入门

XQuery 使您可以操作基于 XML
情势以及非基于形式的数目。以下示例演示了何等使用 XMLTable 函数从 OE
演示数据库方式中查询基于 PurchaseOrder XML 情势的 XMLType 表。

XML索引

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

XML的value()方法

就不啻query()方法一致便捷,诸多时候当您想去检索二个特定的要素或性质的时候,而不是收获XML的成分,这就足以运用value()了。那种措施只会再次来到1个一定的值,不作为数据类型。由此一定要传递三个参数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> 的值

在Listing1陆中,小编钦赐了[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 1玖: 检索多个实例的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 二1: 使用count功用来查找成分个数

结果如下:

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

Listing 2二: 每列数据中<Person> 成分的多少

别的叁个常用的功力是concat(``),
它可以一而再四个或四个XML成分下的多少。你能够钦定你想连接的每1个有的。示例:

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>
下,当然也得以来自不相同。

XPath2.0简介

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;
主XML索引

主XML索引对XML列中XML实例内的全体标识,值和渠道实行索引。创制主XML索引时,相应XML列所在的表必须对该表的主键创设了聚集索引。

总结

 

大家诸多明白了XML在SQLServer
中的简单利用,从概念到利用情势。也观察了query()检索子集,也能应用value()检索独立的要素属性的值。当然除却还有向exist(``)
andnodes()
这样方法,合营语法都以应用,那部分就不再进行讲了,吉安小异。有不知底的能够私聊。更加多使用办法还请访问MSDN来博取(寻觅XQuery
language reference)。

XQuery简介

在以上示例中,您在 XMLTable 函数的 PASSING 子句中央银行使 OBJECT_VALUE
虚拟列将 purchaseorder 表作为左右文项传递给那里使用的 XQuery
表达式。XQuery 表明式计算用户 EABEL
请求的种种购买订单的累计,并为处理的种种订单生成1个 OrderTotal XML
成分。要拜访生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
虚拟列。最后的输出应如下所示:

辅助XML索引

为了巩固主XML索引的属性,可以创建帮忙XML索引。唯有创制了主XML索引后本事制造援助XML索引。支持XML索引分三种:PATH,VALUES和PROPERTY辅助XML索引。

XQuery的优点

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

EABEL-20021009123338324PDT
1328.05


EABEL-20021009123335791PDT
2067.15


EABEL-20021009123336251PDT
289.6


EABEL-20021009123336382PDT
928.92
开创索引

为表中有个别列创设索引,须求该列是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

注:帮助索引的命名无法与主索引同样。

XQuery的应用领域

要博取同样的尾声结出,可以改用 XMLQuery 函数。但壹旦将上二个示范中运用的
XQuery 表明式参数字传送递给 XMLQuery(如下所示):

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

注:删除主索引,与其有关的富有补助索引也会被剔除。由此地点语句中去除学生消息表索引后,协工学生消息表索引也被删去了。

在服务器端使用XQuery的独到之处

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;
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)
);

结果如图所示
图片 25
在上述语句中,sp_xml_preparedocument存款和储蓄进度语句用了1个参数,在那之中@Student是二个int型变量,该存款和储蓄进程会将句柄存款和储蓄在@Student变量中作为结果数据,@StudentInfo是八个XML类型的变量,存储了就要举行辨析的XML文书档案。
OPENXML函数的言辞中,使用了二个参数,个中@Student代表已经经过sp_xml_preparedocument存款和储蓄进程分析的文档的句柄,’/row’使用XPath情势提供了三个渠道,代表要赶回XML文书档案中该路径下的多少行,二是3个可选数据参数,表示将那一个多少行以成分为着力映射。

当使用XML Schemas时如何实行XQuery

则 XQuery 表明式重返的空系列将与 purchaseorder
表联接,从而包涵在询问总计果集中。实际上,那意味输出将不仅包括为用户
EABEL 请求的订单生成的 OrderTotal 成分,而且还包括为 purchaseorder
表中存款和储蓄的具有别的订单生成的空行(暗中认可情形下,purchaseorder 表包涵 132行)。从结果集中清除空行的艺术之一是在 SELECT 语句的 WHERE 子句中央银行使
existsNode SQL 函数,而不是在 XQuery 表达式中动用 WHERE 子句,如下所示:

XQuery表明式的结构

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;

XPath 2.0表达式

以上查询与本有的先河的 XMLTable 示例生成同样的出口。

FLWOR语句

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

For

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

Where

正如本文从前(参阅使用关周密据创设 XML部分)介绍的演示所示范,使用
fn:doc 格外轻巧直接。它拿走表示消息库文件能源 (U牧马人I) 的字符串并再次来到该 U奇骏I
指向的文书档案。要询问 fn:collection XQuery
函数的功用,同一文件夹中足足应当几个音信库文件。借使已经运维了列表 1中的代码,则早已创办了 /public/employees 新闻库文件夹并在在那之中蕴藏了
employees.xml 文件。由此,您将需求在该文件夹中最少再创造贰个 XML
文件,然后工夫试用 fn:collection。列表 二 中的 PL/SQL 代码基于
SCOTT/TIGE瑞鹰 演示数据库格局的 dept 和 emp 表存款和储蓄的关周全据构建XML,然后将扭转的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
音信库文件夹。要运维列表 二 中的 PL/SQL 进度,请保管以 SCOTT/TIGE大切诺基的身价登入。

order by

列表 2:基于关全面据营造 XML 并将其保存到 XML 新闻库

return

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;
/

FLWOR表达式vs. XPath表达式

此时,/public/employees
消息库文件夹应涵盖多个文本:acc_dept.xml(由列表 二 中的 PL/SQL
代码生成)和 employees.xml 文件(由列表 一 中的代码生成)。由于那一个 XML
文书档案存款和储蓄在同等新闻库文件夹中,因而得以应用 fn:collection 函数访问三个XML 文档中存储的职员和工人消息。然则,固然那几个 XML 文书档案均蕴涵职员和工人 XML
成分(这一个因素实际上具备一样结构),但 XML 文书档案本身的构造迥然差别。在
employees.xml 中,文书档案根成分为 EMPLOYEES,而 acc_dept.xml 将 DEPARTMENT
用作根成分。要化解此难点,可以透过 XQuery 使用 XPath // 构造,从而导航到
XML 文书档案中的某些节点,而毋庸钦命该节点的确切路线。以下示例演示了什么样在
XQuery 表明式中应用 XPath // 构造:

XQuery的操作

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

数学生运动算符

该社团应生成以下输出:

比较运算符

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

平时相比较运算符

你能够看出,以上输出蕴含从 employees.xml 和 acc_dept.xml 中获得的员工XML 成分,那么些因素表示薪资大于或等于 5,000 澳元的职员和工人。

数值相比较运算符

将 XML 分解为关周密据

节点比较运算符

假如应用程序处理关周详据而非 XML,而你必要拜访的数目以 XML
格式存款和储蓄,则将 XML
分解为关周密据恐怕会那些实惠。继续张开上1些的演示,您可以使用 SQL
函数 XMLTable 将职工 XML 成分分解为虚拟表的单个列,如下所示:

节点顺序比较运算符

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;

逻辑操作符

该查询将调换以下输出:

if-then-else语句

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

使用XQuery构造XML

询问外部数据源

XQuery构造器 vs. FOR XML语句

使用 XQuery,可以依照 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其地方怎么:无论是存款和储蓄在数据库中、置于网站上、即时创制或许存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中蕴藏的数目开始展览的 XML
操作提供了非常高的习性和可伸缩性。因而,要是您能够完全调整所处理的多寡,则最佳将它移动到数据库中。

XQuery内置函数

正如你以前方的示范中打探到的,在 Oracle XQuery 实践中,doc 和 collection
XQuery 函数用于访问 Oracle XML DB 新闻库中蕴藏的 XML 文书档案。可以通过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外部数据源。思量以下示例。要是你的铺面要为那二个从事于 XQ
项目标职工支付奖金。因而,财务部发表了 empsbonus.xml
文件,当中蕴涵有资格取得奖金的职员和工人列表以及该列表中输入的各类职工的奖金多寡。empsbonus.xml
文件只怕如下所示:

数码访问

100
1200


101
1000

字符串的拍卖

在其真实情形况中,以上的 XML
文件大概置于网址上(因此能够透过网络获取)、以文件格局储存在当半夏件系统中,或以文件能源格局储存在
Oracle XML DB
音信库中。就本示例来讲,该公文位于网址上。为简便起见,能够在目录(Web
服务器在当中蕴藏可从 Web
看到的文书档案)中开创一个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便能够经过以下 U凯雷德L 访问 empsbonus.xml 文件:

会师函数

http://localhost/employees/empsbonus.xml

前后文函数

接下去,假诺您须要依据 empsbonus.xml
文书档案中储存的数码创设3个报表。在该报表中,您只怕不只要包蕴列表中体现的奖金多少以及各样职工的职工
ID,还要包涵他/她的真名。由此,可以率先选取以下查询生成二个新的 XML
文书档案(要是你以 HCRUISER/H奥德赛 的地方连接):

涉及项目表达式

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;

花色评释表明式

上述查询是二个有关怎么着运用 XQuery 基于 XML 和非 XML
数据(以分歧的主意从分歧的数量源中检索)生成 XML
文档的以身作则。具体来讲,使用 ora:view() 函数访问 HR 演示情势中的暗许
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访问 empsbonus.xml 文书档案。然后,在 FLWOR 表明式的 return
子句中营造新的 XML 文档。最终,将取得以下 XML 文书档案:

如for语句中的xs:TYPE


100
Steven King
1200


101
Neena Kochhar
1000

品种检查表达式

化解质量难题

xs:TYPE实例

正如您在此在此之前方的局地中打听到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的急速方法 – 无论你是拍卖地点存款和储蓄的 XMLType
数据照旧查询基于关周详据构建的 XML
视图。但据书上说对数码应用的囤积类型的不一致,XQuery
表达式的推行质量大概天壤悬隔区别。尤其是,Oracle XML DB 能够优化基于由
ora:view 函数成立的 SQL/XML 视图而创设的 XQuery 表明式。对于 XMLType
表或列中储存的 XML 数据,只好对运用结构化(对象-关系)存储手艺存款和储蓄的基于
XML 形式的 XMLType 数据实行 XQuery 优化。

类型转变函数

所挑选的仓库储存模型并非是影响 XQuery
表达式试行质量的绝无仅有要素。在1些情状下,XQuery
表达式本身的协会也大概导致品质难点。要监察和控制 XQuery
表明式的品质,能够打印并检讨关联的 EXPLAIN PLAN。在 SQL*Plus
中,只需安装 AUTOTRACE 系统变量,就可以打字与印刷 SQL
优化程序选拔的实施路线。但要施行该操作,请确定保障创造 PLUSTRACE
角色,然后将其给予连接到数据库所使用的用户。有关如何实践此操作的音信,请参阅
Oracle 数据库 十g 第 二 版 (10.二) 文书档案中《SQL\Plus
用户指南和参考》一书中的“调控SQL\Plus”壹章。以下示例演示了哪些通过检查 EXPLAIN PLAN
生成的试行安插来收贪图利益润。如若你曾经将 PLUSTRACE 剧中人物赋予私下认可用户 OE,以
OE/OE 的身价登入并运转以下查询:

隐式类型调换

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

显式类型调换

那将转移以下输出:

值类型构造器

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('...

cast as xs:TYPE ?操作符

您也许对为上述查询生成的举办陈设并不惬意。越发是,所处理的行数恐怕尤其大。由于
SQL
调控的主要对象是幸免访问对结果尚未其它影响的行,因而只怕要持续调控查询以优化品质。对查询中带有的
XPath 表明式进行重复建立模型后,能够重复重试它,如下所示:

走访关系性的列和变量

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('...

不援助的性状和办事中的消除方案

您能够看看,以上显示的查询生成一样的末尾结出,但它们的进行布署并不一致。查看最终三个示范中的
XQuery 表明式,您大概会小心到它迭代顶层 PurchaseOrder 成分,当中的各个PurchaseOrder 成分都意味着根据 PurchaseOrder XMLType
情势的表中的1行。那意味着实际上海重机厂写 XQuery
表明式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder
文书档案)中的行。与查询要迭代不意味着基础表中的单个行的 XML
元素比较,该方法的属性越来越好壹些。

顶级施行和引导计划

但在一些景况下,很难发现 XQuery
表明式的哪些构造将使有个别查询的质量越来越好。那正是怎么最棒在开荒阶段使用调控工具的原由。

XML数据的更换

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

布署操作

另一种能够确定狠抓 XQuery
表明式实行品质的技能是行使绑定动态变量。使用绑定变量(而不是将变量串联为字符串)可以使
Oracle 重用 SQL 语句,从而裁减分析花费并显然坚实应用程序的特性。能够在
XMLQuery 和 XMLTable SQL 函数中动用 PASSING 子句将动态变量绑定到 XQuery
表明式。该技巧使您能够依据客户端代码中总计的参数动态生成 XML。列表 三中的示例演示了哪些在从 PHP 脚本试行的 XQuery 查询中利用绑定变量。

剔除操作符

列表 叁:使用绑定变量

Update操作符

//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;
?>

XQuery应用场景

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

现象壹:品质评价系统

100
SKING
AD_PRES

场景2:病例系统

XQuery 与 XSLT

场所三:资金财产管理类别

纵然 Oracle 在 Oracle XML DB 中提供了一个自带 XSLT
处理器,但在不少景色下(特别是在拍卖大型文书档案时),XQuery 对于创设 XML
更神速。其余,XQuery 表达式日常比为同1作业设计的 XSLT
样式表更具可读性,并且更通晓。与 XSLT 一样,XQuery 不但可用来将1个 XML
文档转变为另一个 XML 文书档案,而且还可用以将 XML
转换为另1种基于文本的格式,如 HTML 或 WML。

结论

在本文前面包车型大巴查询 XMLType 数据部分中,您看看了一个有关使用 XQuery 将3个XML 文书档案调换为另2个 XML 文书档案的以身作则。具体来说,该示例使用 XQuery
表明式总计示例数据库形式 OE 的 purchaseorder
表中存储的订单的订单一共,然后为处理的每一个订单生成了一个 OrderTotal XML
元素。实际上,您能够行使 XSLT
实施同一操作。为此,您首先必要创制多个行使于 PurchaseOrder XML 文书档案的
XSLT 样式表,以调换对应的 OrderTotal 成分。对于此示例,能够使用列表 四中所示的 XSLT 样式表。

导言

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

XML是被用来作为壹种文书档案格式而上扬兴起的。可是,XML所具备的别样特征,比如可扩张性、辅助国际标准、表示结构化和半结构化数据的技能,以及人和机械和工具对其大致的可读性,使得它形成一种普遍应用的、平台非亲非故的数据表示格式。由于XML获得了大面积的认可,因而不少用户都用XML来缓解复杂的购买出售难点,例如那个事关到数量集成的主题材料。有过多案例都推荐将新闻一贯存款和储蓄到XML文书档案,那比将音讯先存到数据表中然后再将那么些消息整合XML消息要管用的多。要查看更加多关于那几个案例的音信,能够查阅“微软SQLserver二零零五XML最好施行”白皮书中有关文书档案。XML在蕴藏文档和半结构化数据表示方面包车型地铁使用已经让XML发展成为壹种能够在劳务器端存款和储蓄轻巧多少管理的数额存款和储蓄格式。

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



























 

为方便起见,您只怕须求将此 XSL
样式表保存在数据库中,然后再起来应用它。例如,您能够将样式表作为文件财富保存在
Oracle XML DB
新闻库中。施行该操作的艺术之一是将样式表作为文件保留到当三步跳件系统中,然后利用以下有些网络球组织议将它移动到
XML 消息库:FTP、HTTP 或 WebDAV。假若你已经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
音信库文件夹中,今后可以按以下示例所示将它用作 XMLTransform SQL
函数的参数(借使你以 OE/OE 的地位登陆):

而是那种进步也致使了四个难点-从XML数据中领收取来的信息要作为BLOBs类型存款和储蓄到关系型数据库中,须求1种查询语言来提取XML所抒发的新闻,并使其符合关系型数据库中的供给。Microsoft  SQL
Server  三千提供了OpenXML,它能够被用来询问,从被规划时,就满意了从XML数据映射到关系型数据格式的渴求,但它并不曾完全支持XML数据模型(见表一)。关周全据模型和XML数据模型在无数地点都不等同。下表轻易列举了三种数据模型的要害分歧。

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

 

如上查询将拍卖用户 EABEL 请求的有所订单(即存款和储蓄在 XMLType 的暗中同意PurchaseOrder 表中的订单)并将调换与查询 XMLType 数据部分中的 XQuery
查询同壹的出口。

表一   关系型数据模型与XML数据模型之间的界别

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式进行相比较,您恐怕会专注到,XQuery
方法要比 XSLT 方法更具魔力。至少在运用 XQuery
时,您只需编写很少的代码就可以获得同等的终极结果。

图片 26

查询 CR-VSS 音信提供

 

由于 索罗德SS 消息提供精神上是一个托管的 XML 文件(ENCORESS
信息阅读器从中得到头条音讯或任何内容),因而能够像处理别的别的能够因而Web 获得的 XML
文书档案那样来拍卖它。正如你在本文前边的询问外部数据源部分中所见,能够动用
XQuery 查询别的能够透过 U奥迪Q7L 访问的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全数外部 XML 数据源。以下是一个询问 LANDSS
新闻提供的 XQuery 示例:

 

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文书档案存款和储蓄的最根本的多少个原因。其余,SQL语言在拍卖半结构化恐怕标志新闻时的局限性也敦促了XQuery语言的上进。XQuery语言在规划的时候已经思考到XML数据的特点和处理XML数据的连带主题材料。

该 XQuery 应生成三个 XML 文书档案,在这之中包括 Oracle 技艺网 (OTN) 近期公布的与
PHP 手艺有关的头条信息列表。所生成的 XML 文书档案大概如下所示:

SQL Server 贰零零陆通过内置XML数据类型帮忙XML数据的当地化存款和储蓄。XQuery
一.0本子是经World Wide Web Consortium (W3C)
XML查询工作组定义,基于XML数据的公式化查询语言。XQuery,像SQL同样,是一种注明性的查询语言,就不啻大家在底下的小说军长会看出的如出1辙,能透过骨干的SQL和XPath知识来轻便地驾驭它。

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

正文基于XQuery 一.0在SQL Server 二〇〇六中的执行,同时也依据XQuery 一.0
2004年的办事草图。本文的首先部分提议了新的XML数据类型的总述以及它的相干特点,接下去的局地,分别地介绍XQuery的数不清操作,XQuery的停放函数,关系型表明式,以及SQL
Server
2007不扶助的一部分。最终,介绍近期的特级应用和指点,XML数据的校正以及XQuery的接纳事例的音信。

但在付出实际应用程序时,您将很可能必要 XQuery 表明式直接生成 HTML
标志,而不是独自转移一个如上所示的 XML
文书档案。这样,您便得以创设三个越来越灵活、可维护性更加高的应用程序,原因是在那种地方下,全部SportageSS 处理(从提取必要的多寡到将它包裹在 HTML
标志中)都将转移到数据库。那使你不用编写负责 CRUISERSS
处理的应用程序代码。实际上那意味着你不要在比如 ENCORESS
音信提供的协会已经转移的情事下修改应用程序代码。相反,您只需修改用于 瑞虎SS
处理的 XQuery 表明式。

引用:

总结

SQL Server 二零零六中的XML数据类型

你曾经在本文领悟到,XQuery
是二个归纳的查询语言,它提供了一种用于查询、创设和更动 XML
数据的迅猛方法。固然 Oracle XQuery 实行使你能够操作任何可以用 XML
表示的数量(无论它存款和储蓄在数据库中、位于网站上或然存款和储蓄在文件系统中),但将处理的数码移动到数据库中始终是一个不利的意见。对于数据库中储存的多少,Oracle
XML DB(对 XPath
重写使用一样机制)只好眼看优化处理那些基于以下数据塑造的 XQuery
表明式:那个数据包蕴关周密据、对象-关周密据或使用结构化(对象-关系)存款和储蓄技巧存款和储蓄的遵照XML 格局的 XMLType 数据。

SQL Server
二〇〇五引进的新XML数据类型使得用户具备在数据库中存储XML文档和段子的力量。1个XML数据类型能够用来创建列,用来成立存储进度大概存款和储蓄函数中的参数,或用来成立变量。别的,用户能够提到3个XML类型的列和多少个XML
Schema集来成立3个新的类型化的XML列。集合中的XML
Schema被用来声明和类型化XML实例。

(主编:铭铭)

 

原文:Oracle
XQuery查询、创设和调换XML

回到数据库首页

品类化vs.非类型化的XML数据类型

XML数据类型与XML
schema集相关联,为XML实例增加了Schema的强制性约束。如若XML数据被波及到3个XML
Schema集合,它就被称之为类型化的XML。不然,就称为非类型化的XML。

 

SQL Server 二〇〇五中XML数据类型实现了ISO
SQL-200三条件XML数据类型。它不但能够存款和储蓄结构能够的XML1.0文书档案,也能储存根节点为文本的所谓的XML内容段落,也能储存包蕴自由数目根成分的始末。针对全数卓绝格式数据的反省已经变成,这么些检查不必把XML数据类型绑定到XML
Schemas。那一个从没理想格式的数码不能够被检查。

 

当Schema是不可见的时候,非类型化的XML就很有用。当Schema可见,但它的转移极快以至于很难保险的时候,大概当存在四个Schema,最终的绑定取决于外部的需要时,非类型化的XML也很有用。其它,当XML
Schema中蕴藏数据库引擎不援助的XML
Schema结构时,非类型化的XML也很有用。在这一个情状下,你能够行使在集体语言运转时(CL宝马X五)用户自定义功效中的System.XML验证器来提供实惠验证。

 

假诺在XML Schemas集中,你有XML
Schemas来描述您的XML数据,你可见通过关联XML
Schema集和XML列用来提供类型化的XML数据。XML
Schema被用来注明数据的实惠;在编写翻译查询或许数额编辑语句时期执行比非类型化XML特别规范的品种检查;大概被用来优化存款和储蓄和询问的处理功用。

 

类型化的列,参数和变量能够存储XML文书档案(Document)也许内容段落(Content),在评释的时候,你可以经过按钮钦定你存款和储蓄的种类(文书档案也许内容,暗中认可的是内容)。此外,你不可能分歧时提供2个XML
Schema集。如若各种XML实例唯有三个根元素,那么钦赐为文书档案类型,不然内定为内容类型。在静态类型推断期间,XQuery编写翻译器使用文书档案(Document)标识音讯来测算单个的根元素。

引用:

XML数据类型的主意

XML数据类型援救各类艺术来操作XML实例。XML数据类型的措施描述如下:

query()
方法带领二个对若干个XML节点求值的XQuery表明式,允许用户查询五个XML文档中的段落。那个方法的再次来到值四个非类型化XML文件类型的值。

 

value()
方法是用来从二个XML文书档案数据值中提取关系型数值。那些方法指引三个用来辨别单个XML节点的XQuery表达式并重返期望获取的SQL类型。XML节点的重回值被撤换为钦命的SQL类型。

 

exist()方法允许用户在XML文书档案中实行查询以确认一个XQuery表明式的结果是不是为空。当XQuery表明式再次回到1个非空的结果时,这几个办法的再次回到值为1;当表明式再次来到空时,方法重返值为0;当XML实例本人为NULL时,就回去NULL值。

 

采纳XML数据类型的nodes()方法能够较轻易的把多少个XML文书档案分解为关系型数据。nodes()方法接受一个XQuery表明式,并回到三个行集(Rowset),行集中的每1行都讲述二个由询问表明式所标记出来的上下文节点。XML数据类型的其他格局,如query(),
value(),exist(),和 nodes(),都能调用nodes()方法重回的上下文节点。

modify()方法能用来对1个XML文书档案的始末打开改造。它补助XML
DML语句,从而完成在三个XML实例中插入、更新可能去除2个或多少个节点。当它遭受3个NULL值时,它会报错。

详见内容,查阅“微软SQLserver2005 XML最棒实行”白皮书。

XQuery入门

XQuery是1种用于XML查询的新语言,援助基于XPath二.0的多少浏览和征集。本章节为大家起初展现了XQuery语言各方面包车型地铁始末,比如XQuery和XPath之间的关联,XQuery的帮助和益处,XQuery的应用领域,XQuery中XML
Schema的平整等等。

 

XPath2.0简介

XPath一.0,是由W3C工作组定义,用于在单个XML文书档案中定位节点的言语。XPath一.0施用基于路线的条条框框来标志XML文书档案中的节点。同时它定义了XSLT
1.0和XPointer的基本规则。XPath
1.0有处理字符串、布尔值和浮点数的嵌入函数。它定义了基于设置的过滤标准来过滤节点的语法。X帕特h
1.0正在进级为XPath 贰.0以支撑越来越多的连串项目,提供愈多的效能。XQuery
①.0依据对XPath
二.0,扩充了排序、重装、构变成效,而且落到实处了XPath贰.0决无法完成的多寡浏览和过滤方面包车型大巴属性。

 

XQuery简介

XQuery是三个足以定义、类型化、函数化的语言,是XML查询组专为从XML格式中询问数据而安顿的言语。XQuery具有与XML标准种类中XPath
②.0和XSLT 二.01致的数据模型和XML
Schema类型系统。设计XQuery用于拍卖非类型化XML文书档案(不包罗涉及数据的schema),类型化XML
schema,恐怕两者的混合体。仿佛上文提到的,XQuery
一.0几近是X帕特h二.0的庞大集。XQuery
1.0除了具备XPath贰.0的本性外,它还装有上边包车型地铁天性:

•        在FLWO纳瓦拉语句中加进了order by语句,它能够对文书档案数据举办重复排序。

•       
在FLWO奥迪Q5语句中加进了let语句,它亦可钦点表达式的结果以完成越多的运用(SQL
Server 2006中不扶助)。

•       
在查询语句的嵌缀部分,能够钦点静态的上下文节点(比如命名空间的绑定前缀namespace
prefix bindings)。

•        提供协会新节点的功力。

•        允许用户自定义函数(SQL Server 2007中不帮衬)。

•        能够创设modules/libraries(SQL Server 2007中不扶助)。

XQuery的优点

•        当前的SQL和XPath知识是很容易学习的。

•        相比较XSLT的询问语句,XQuery查询语句代码更简洁。

•       
当XML数据是类型化的,那么XQuery是1个强类型语言,它亦可透过制止地下的类型转变以及确认品种是还是不是能够在询问操作中行使,来增加查询语句的实行效能。

•        XQuery能同日而语弱类型语言应用,为非类型化数据提供更加强的职能。SQL
Server 二零零六提供了并且援助强类型和弱类型三种关系的静态类型。

•        因为XQuery实施查询供给的代码比XSLT少,所以它的实施功能也高。

•       
XQuery正在成为W3C工作组的推荐介绍语言,同时它也将会被主流的数据库提供商所辅助。

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

•        XQuery规范是依据当前支出条件开始展览阐释,未来可能会产生变化。而SQL
Server 200伍是W3C工作草图所达成的祥和部分,不会发生变化。

 

XQuery的应用领域

相似,XQuery的应用领域分类如下:

•       
查询和剖析数据:XQuery在询问大体量数据时表现优异,而且能够过滤、分类、排序以及转变须求的消息。典型的XML文书档案查询的使用包蕴描述半结构化音信,定义name-value包,分析日志,处理日志以及监督应用的日志来查找潜在的选拔错误和平安地点的题目等等。

•       
XQuery的购并应用:当组织初叶吐弃自身个人的三合一应用措施,而起先使用标准的以集成应用为底蕴的办法时候,知足把单个应用中内部定义使用的数额转变为标准的能够格式化转换的多少的要求就改成一流主要的标题。因为XQuery能够协会并转换XML数据,所以XQuery就满足了这一个要求。在合龙应用领域,三个一流的XQuery应用是把本地使用的XML数据库/关系型数据能源的词汇表,翻译为别的八个应用者的地方XML数据库/关系型格式数据语言。

 

在劳务器端使用XQuery的优点

比较之下起在客户端处理XML进程,在劳动器端使用XQuery来处理XML进程要全数越来越多的优点。当中部分亮点能够统计如下:

•       
缩短网络负载:在服务器端处理XML数据,只把结果传递到客户端,收缩了网络负载。

•       
越发安全:唯有当使用客户端XML进度时才把客户端须要的多寡传递到客户端,幸免在互连网上传输完整数据而带来的高风险。

•       
更易维护:在劳务器段处理XML能使得浏览器独立于客户端代码,那能够更易于的保障客户端。

•       
质量的寻行数墨:在服务器端使用XQuery写的查询语句可以行使SQL查询器进行优化。那样优化处理的属性要大于在客户端重新赢得多少并拓展多少过滤。别的,还是能通过为XML数据类型的列创立索引来获得越来越强硬的习性。

 

当使用XML Schemas时怎么推行XQuery

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

•        在插入操作中来实例化XML。

•        在退换操作中来实例化XML。

•        在拓展最早的静态类型错误检查和改良询问质量时,XML
schema中的类型消息被用来分明最好的询问安顿和幸免过多运作时的检错。

•        XML schema中讲述的类型音信被SQL Server用来优化存款和储蓄。

引用:

XQuery表明式的结构

SQL Server
200第55中学的三个XQuery表达式包罗四个部分—前缀(prolog)和大旨(body)。前缀能每一个注解包罗的命名空间。命名空间的声明能够经过炫酷前缀和命名空间的USportageI,使您能够用前缀来顶替查询体中的命名空间的UPAJEROI。通过暗中认可评释命名空间(declare
default
namespace)的宣示,你不用绑定元素名称的暗中同意命名空间就足以引用成分的名号。

 

XQuery表达式的主体包蕴了概念查询结果的查询表达式。比如,它能够是1个FLWO君越表达式(参见本小说节的“FLWO中华V语句”),三个XPath
二.0 表明式(参见本小说节的“XPath
二.0表达式”),或然别的2个XQuery表达式比如3个构造或算术表明式。

 

实例:在XQuery头中声称暗中认可的命名空间

上边是从全部干部中寻觅2个JobCandidateID等于三的应聘者。查询中只定义了三个暗中同意命名空间,而从不使用别的2个命名空间前缀。

SELECT Resume.query(‘

        declare default
namespace  “”;

        /Resume/Employment

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

 

实例:使用“WITH XMLNAMESPACES”语句证明命名空间

SQL Server同样支持SQL-2003的行业内部扩张,允许用户在SQL的每二个SQL查询要素上绑定XML命名空间,那样就足以幸免重新注解同样的XML数据类型的办法。上边的询问呈现了前头查询实例修改后的版本。那几个查询利用WITH
XMLNAMESPACES 语句评释了一个命名空间。

WITH XMLNAMESPACES(

AS  “RES”)

SELECT Resume.query(‘

        /RES:Resume/RES:Employment

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

 

XPath 2.0表达式

XQuery使用X帕特h二.0表达式查找三个文档中的节点,在1个文档中移动节点依旧在文书档案间活动节点地点。定义移动路径的XPath是贰个互相分离的步子组成的平稳队列。每1个手续包罗三个axis,1个node
test和五个步骤判定。

 

Axis表明了活动的自由化,和上下文节点的关系。SQL
Server200第55中学支持的axes是child, descendant, parent, attribute, self
以及descendant-or-self。

 

二个node
test表达了步骤采纳的这么些节点所必不可缺满意的规范。节点的规范能够根据节点名称或许节点类型来说明。

 

手续推断可以用动作(predicates)大概重新引用(dereference)。多少个动作就充当3个在相当框架下定义的1个节点队列中的节点过滤器;1个双重引用反映出一个节点队列中各节点的性质以及成分是还是不是与参照节点的同样。作为重新引用的输入,该节点队列必须带有IDREF只怕IDREFS类型的要素只怕性质。重新引用能够生出2个新队列,其各节点ID类型的属性值都相配取自输入队列桐月素和性质的IDREF值。

 

XPath表明式的步骤是能够提到求值的。每一个步骤试行时都为下一步设置了赋值的左右文项。Path表明式中的一个左右文项正是贰个节点,它被增选作为X帕特h表明式中每种步骤实行的重返值。依照前一步所赚取的上下文节点能够关联求稳当前的手续。XPath表达式实践完全部手续的归来结果就将是多个基于path表明式排列的文书档案中节点的雷打不动队列。

 

上面包车型客车表明式用AdventureWorks数据库中的表[HumanResources].[JobCandidate]来举例表明了path表明式的定义。下边包车型客车path表明式选取了address类型节点中值为Home的节点。

//child::ns:Addr.Type[.=”Home”]/parent::node()

Path表达式:

•        child 是axis的定义。

•        :: 是 axis 的分隔符。

•        ns 是命名空间前缀。

•        Addr.Type 是 node test。

•        [.=”Home”] 是二个针对上下文节点的动词表明式。

XQuery同样支撑缩写语法来证明axis。上边包车型地铁表格列举了axis以及相应的缩写语法。

表 二  axes缩写语法

图片 27

 

 

以身作则:从历史工作中采用工作单位的名号

下边所示的XPath表达式选拔了Emp.OrgName文本类型的,同时也是Resume/Employment子节点的节点。在此处,text()用来抉择Emp.OrgName成分文本类型的子节点:

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

引用:

FLWOR语句

FLWO奥迪Q7语句组成了XQuery表明式的重视点,它与SQL的SELECT语句很一般。FLWO奥迪Q5(发音同“flower”)是FOHighlander,
LET, WHERE, OCRUISERDE凯雷德 BY,
RETU奇骏N的缩写。XQuery的FLWO奇骏表明式能够拓展双重注明、变量绑定、过滤、排序以及重回结果的操作。SQL
Server 2006中协理FOHaval, WHERE, O奥迪Q5DE瑞虎 BY和 RETUCR-VN:

For

FLWOHummerH二表达式中的for语句协理用户定义贰个变量来遍历有个别输入体系。该输入种类可以行使XPath表明式、原子值连串、分隔符体系或结构化函数。由此,那里的for语句与SQL
SELECT FROM语句看似,但与编制程序语言中的“for”语句分歧。

 

绑定变量同样能够运用for语句注明。

 

以身作则:使用for语句从简历中寻觅全体的家中地址

下边包车型大巴询问得出了JobCandidateID等于三的应聘者的address节点值等于Home的因素。

SELECT Resume.query(‘

        declare namespace
RES=””;

        for $A in /RES:Resume/RES:Address/RES:Addr.Type[.=”Home”]/..

        return 

        $A 

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

Where 

FLWO普拉多说明式中接纳Where语句能够筛选1个迭代的结果。

 

示范:使用where语句选取具有的家园地址

下边包车型大巴询问得出了JobCandidateID等于叁的应聘者的address节点值等于Home的要素。

SELECT Resume.query(‘

        declare namespace
RES=””;

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

        where $A/RES:Addr.Type[.=”Home”]

        return 

        $A 

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

order by

Order by关键字能够对回到结果集实行排序。Order
by关键字可以运用二个排序表达式,那一个表明式必须回到二个原子值。一般,你能够展开升序大概降序排列。私下认可的排序依次是升序。

 

演示:使用order by语句对查询出来的历史工作进行升序排序

上边包车型客车询问对JobCandidateID等于叁的应聘者所从事过的差事依照其行事时间张开了升序排序。

SELECT Resume.query(‘

        declare namespace
RES=””;

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

        order by $EMP/RES:Emp.StartDate

        return 

        $EMP 

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

return

Return语句,和SQL中的SELECT语句看似,能够内定询问的结果。你能够在return语句中使用别的2个一蹴而就的XQuery表明式。你同1也得以经过在return某其中证实成分的协会、属性等来组织XML结构。

 

示范:使用return语句选取历史职业

上边包车型地铁查询得出了JobCandidateID等于三的应聘者所从事过的兼具事情的发端日期,停止日期,职业单位名称,工作地方。

SELECT Resume.query(‘

        declare namespace
RES=””;

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

        order by $EMP/RES:Emp.StartDate

        return

          <Employment>

                { $EMP/RES:Emp.StartDate }

                { $EMP/RES:Emp.EndDate }

                { $EMP/RES:Emp.OrgName }

                { $EMP/RES:Emp.JobTitle }

          </Employment>

‘) as Result

FROM [HumanResources].[JobCandidate]

WHERE JobCandidateID = 3

当前在SQL Server
二〇〇五中,XQuery还不扶助let语句。那上头更加多内容可参见本文章节“不帮助的表征和工作中的化解方案”。

 

FLWOR表达式vs. XPath表达式

当陈设张开的查询在for变量和for语句体之间含有二个JOIN操作时,类别能够用XPath说明式表明,但会导致执行功效低,那一年理应利用FLWOCR-V语句来定义该连串。唯有当上面列举条件中的三个依然多少个获得满意时,才合乎利用FLWO智跑表明式。

•       
要是想对多少个作为某表明式重回结果的行列值实行迭代,你能够通过在for语句中绑定二个继续结果集值的变量来兑现。实例都以由在for语句范围内同时保持复制的新因素构成。

•       
当你要对for语句的结果体系进行过滤,而过滤是基于1个谓词且该谓词还不可能选用轻易的XPath表明式实行认证时,使用where语句就能够实现对结果集的过滤。示例如下:

DECLARE @result xml

SET @result =
‘<Result />’

SELECT @Result.query(\’

for $i in (1, 2, 3), $j in (3, 4, 5)

where $i < $j

return sum($i + $j)

‘) as Result

•        借使您想依照二个简练表明式对结果集举办排序,那么能够运用order
by语句完毕。

•       
当你要动用for语句的回来结果来定义再次回到结果集的项目时,使用return语句能够完结。

在具有其余案例中,推荐应用XPath表达式。

 

XQuery的操作

作为1种效率性语言,在SQL
Server二〇〇五中帮衬XQuery的有余数据类型的函数和操作,可分类如下:

•        数学生运动算

•        相比较运算

•        逻辑运算 

表 三 SQL Server二〇〇七支持的运算符

图片 28

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图