澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

在SQLServer中的使用,构建和转换XML

XML查询才能

XML文书档案以一个纯文本的样式存在,主要用来数据存款和储蓄。不但方便用户读取和选用,何况使修改和维护变得更易于。

 

在 Oracle 数据库 10g 第 2 版中,Oracle 引入了八个与该数据库集成的专职能自带 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));

在上头的躬体力行中,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数据类型的接纳范围
独有ST牧马人ING数据类型能力转变到XML。
XML列不可能使用于GROUP BY语句中
XML数据类型存款和储蓄的数码不可能超出2GB
XML数据类型字段不可能被设置成主键恐怕外键或称为其一部分。
Sql_variant数据类型字段的使用不可能把XML数据类型作为种子项目。
XML列不能够内定为独一的。
COLLATE子句不能够被接纳在XML列上。
存款和储蓄在数据库中的XML仅援助128级的档次。
表中最对只好具备三12个XML列。
XML列不能到场到法则中。
独一可接纳于XML列的松手标量函数是ISNULL和COALESCE。
怀有XML数据类型列的表无法有二个超过15列的主键。

SQL Server对于XML帮衬的为主在于XML数据的格式,这种数据类型能够将XML的数据存款和储蓄于数据库的对象中,比如variables, columns, and parameters。当您用XML数据类型配置这么些目的中的多少个时,你钦命项目标名字就如您在SQLServer 中钦赐二个项目同样。

本文提供的演示不仅仅示范了在怎么场馆下以及怎么样行使 XQuery 查询、创设和调换XML,并且还演示了什么监察和控制和深入分析 XQuery 表明式的性质推行,进而找到越来越高效的不二等秘书技来管理同一职业负荷。

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

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

XML的数据类型确认保证了您的XML数据被完好的营造保存,相同的时间也合乎ISO的正统。在概念贰个XML数据类型此前,大家首先要掌握它的几种限制,如下:

听别人说关全面据营造 XML

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>的子元素

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

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

结果如图所示
图片 3

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

查询结果如图所示
图片 4

注:SQLType不可能是XML数据类型,公共语言运维时(CL索罗德)用户定义类型,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 '插入节点后信息'

询问结果插入节点后新闻如图所示
图片 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列不能够满含超越2GB的数据。
  • 一个XML的列不能够是索引。
  • XML对象无法运用Group By的子句中。
  • XML的数据类型不扶助相比较和排序。

在急需的情事下(举例,向 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途锐的暗中同意员工涉嫌表中存款和储蓄的数目构建 XML 文书档案。

XQuery简介

XQuery是一种查询语言,能够查询结构化恐怕半结构化的数目。SQL Server 二〇〇八中对XML数据类型提供了支撑,能够存储XML文书档案,然后利用XQuery语言实行查询。

概念三个XML变量

列表 1:使用 ora:view 基于关周详据创造 XML

FOR XML子句

因而在SELECT语句中运用FOCRUISERXML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server 二〇一〇支撑FOEnclaveXML的三种模式,分别是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
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格式(FO翼虎 XML RAW)
Student表的数码如图所示
图片 7
实施语句:

SELECT * FROM Student FOR XML RAW;

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

这几个事例通过运用DECLARE  评释去定义名称叫@ClientList 的变量,当自家证明变量的时候,只供给包罗XML的数据类型的名字在变量名后。

在列表 1 中的第二个 PL/SQL 进程中,您只是在 XML 音讯库中创立了二个新文件夹。在该音讯库文件夹中,您随后将积累此处显示的第二个PL/SQL 进度中创立的 XML 文书档案。第一个 PL/SQL 进程首头阵出 SELECT 语句,该语句使用 XMLQuery SQL 函数基于关周全据构建 XML。对于 XQuery 表明式(XMLQuery 在此地将其作为参数)来说,请留神嵌套的 FLWOWrangler表明式中接纳的 ora:view XQuery 函数。在该示例中,ora:view 获取三个输入参数,即“HEscort”和“employees”,它们提醒该函数查询属于 HPRADO数据库情势的员工表。由此,ora:view 将赶回叁个表示 H科雷傲.employees 表行的职员和工人 XML 文书档案种类。但为了节约结果文书档案中的空间,只将前七个职工记录传递给结荚体系。那是经过在 FLWO科雷傲 表明式的 where 子句中钦定 $i/EMPLOYEE_ID <= 102 而落到实处的。请细心 FLWOMurano 表明式的 return 子句中运用的 xs:string()xs:integer() XQuery 类型表达式。实际上,此处使用的那多个 XQuery 表明式不只有将 XML 节点值转变为相应的种类,并且还将领到这一个节点值。随后,生成的职工 XML 文书档案作为 employees.xml 保存到事先在列表 1 中另多个 PL/SQL 进程中创设的 /public/employees XML 新闻库文件夹。要确定保证此操作已造成,可实施以下查询:

FOR XML AUTO

选取表名称作为成分名称,使用列名称作为质量名称,SELECT关键字前面列的一一用于XML文档的层系。
示例10:将Student表转换为XML格式(FOCR-V 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情势中的各种限制。无法将FO宝马X5 XML EXPLICIT直接用在SELECT子句中。
示例11:将xmlTest表调换为XML格式(FO景逸SUV 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
在结果图中大家开掘,红框中3个班级新闻列在一块儿,而具有学生都列在高级中学一年级3班下,那不是大家想要的结果,我们期待每种班级对应本身的学生。那么怎么样消除此类难点呢,那事关到排序。

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

第一删除代码行末的FOLX570 XML EXPLICIT语句,仅仅实行剩下的一些,使结果以表格情势表现,那么结果如下
图片 15
本条表格每行的逐一也象征了该表格转化为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]排序。让我们看看结果什么。
运营方面包车型大巴代码,但不运转FOTiguan 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表,看看各类班级和它下属学生的层级关系是或不是有误。

注:写FO本田CR-V XML EXPLICIT代码要留神,层级1的代码中先安装层级结构,不要先急着赋值。在部属层级的代码中对层级第11中学的代码举办赋值,最棒重复赋值,不然就能够现出文中的排序难点。假若某些层级出现重复数据,在该层级的代码前加DISTINCT关键字。消除排序难题最棒的格局是对各样层级的本性重复赋值并在结尾用O奥迪Q5DER BY按层级属性排序。

稳重察看地方的XML文书档案,开掘总分属性的值是个float类型,要把它调换到int,只供给把层级3中对总分的赋值代码改成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情势为每一项自动生成

 


100
King
24000


101
Kochhar
17000


102
De Haan
17000
未曾称谓的列

上面介绍一种简易的FO卡宴 XML PATH应用措施

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

询问结果如图所示
图片 19

注:假设提供了空字符串FO奥德赛 XML PATH(‘’)则不会生成任何因素。

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

询问结果如图所示
图片 20
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中培育>=700分的学员的班首席营业官音讯和学习者新闻,并转载成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文书档案插入了进去,不过它是被当做二个单一的值插入到表列里面来。

相比以上所述,创立和插入都是很直白省略的,接下去大家看一下怎么样创建二个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的数额。

在以上 XQuery 中,fn:doc XQuery 函数用于访谈 Oracle XML DB 消息库中寄存的单个 XML 文书档案。但一旦要管理部分具有同等或一般结构的 XML 文书档案(存款和储蓄在同一 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贰零壹零奇骏2。实例中带有了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: 创制测量试验情状和数据

查询 XMLType 数据

FO大切诺基 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方法,查询结果如下图所示
图片 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 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>

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

XQuery 使您能够操作基于 XML 形式以及非基于情势的数量。以下示例演示了如何运用 XMLTable 函数从 OE 演示数据库格局中询问基于 PurchaseOrder XML 格局的 XMLType 表。

XML索引

是因为XML数据类型最大可存款和储蓄2GB的多寡,由此供给创造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> 下,当然也能够来自不一致。

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

在上述示例中,您在 XMLTable 函数的 PASSING 子句中运用 OBJECT_VALUE 设想列将 purchaseorder 表作为左右文项传递给这里使用的 XQuery 表达式。XQuery 表明式总括用户 EABEL 央求的各类购买订单的一同,并为管理的各种订单生成三个 OrderTotal XML 成分。要探问生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE 虚构列。最后的出口应如下所示:

辅助XML索引

为了提升主XML索引的习性,能够创设协理XML索引。只有创造了主XML索引后技术制造协理XML索引。帮助XML索引分3种:PATH,VALUES和PROPERTY协助XML索引。

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

注:协理索引的命名不能够与主索引一样。

要拿到一致的末段结果,能够改用 XMLQuery 函数。但要是将上叁个演示中应用的 XQuery 表明式参数字传送递给 XMLQuery(如下所示):

修改和删除索引(ALTEKoleos 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 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存款和储蓄进度语句用了2个参数,个中@Student是三个int型变量,该存款和储蓄进程会将句柄存款和储蓄在@Student变量中作为结果数据,@StudentInfo是一个XML类型的变量,存款和储蓄了将在实行分析的XML文书档案。
OPENXML函数的语句中,使用了3个参数,在那之中@Student代表曾经经过sp_xml_preparedocument存款和储蓄进度深入分析的文书档案的句柄,’/row’使用XPath方式提供了一个渠道,代表要重返XML文书档案中该路线下的多寡行,2是三个可选数据参数,表示将这个数据行以元素为中央映射。

则 XQuery 表达式再次来到的空系列将与 purchaseorder 表联接,进而包罗在询问总括果集中。实际上,那意味输出将不唯有带有为用户 EABEL 央浼的订单生成的 OrderTotal 成分,何况还蕴藏为 purchaseorder 表中贮存的保有其余订单生成的空行(默许景况下,purchaseorder 表包括 132 行)。从结果集中拔除空行的法子之一是在 SELECT 语句的 WHERE 子句中使用 existsNode SQL 函数,并非在 XQuery 表明式中应用 WHERE 子句,如下所示:

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;

如上查询与本有的起初的 XMLTable 示例生成同样的输出。

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

为访谈 Oracle XML DB 音信库中蕴藏的 XML 数据,Oracle XQuery 引进了 fn:doc 和 fn:collection XQuery 函数。使用 fn:doc,您能够查询 XML 消息库中寄存的单个 XML 文书档案,而 fn:collection 让你能够访谈同一消息库文件夹中蕴藏的多少个 XML 文书档案。

正如本文此前(参阅使用关周详据创设 XML部分)介绍的亲自过问所示范,使用 fn:doc 特别简单直接。它赢得表示信息库文件财富 (UCRUISERI) 的字符串并回到该 ULX570I 指向的文书档案。要打听 fn:collection XQuery 函数的效率,同一文件夹中最少应当多个消息库文件。假若已经运转了列表 1中的代码,则早已成立了 /public/employees 新闻库文件夹并在内部蕴藏了 employees.xml 文件。由此,您将索要在该公文夹中足足再制造一个 XML 文件,然后技巧试用 fn:collection。列表 2 中的 PL/SQL 代码基于 SCOTT/TIGEXC90 演示数据库形式的 dept 和 emp 表存款和储蓄的关周全据构建XML,然后将转移的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees 音信库文件夹。要运维列表 2 中的 PL/SQL 进度,请确定保障以 SCOTT/TIGE福特Explorer的地位登陆。

列表 2:基于关周密据营造 XML 并将其保存到 XML 信息库

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

那儿,/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 // 构造:

本文由澳门皇冠金沙网站发布于数据库研究,转载请注明出处:在SQLServer中的使用,构建和转换XML