XML 在SQLServer中的使用

可以把它用在任何普通SQL数据类型可以使用的地方,可用于SQL语句或者作为存储过程的参数,这种数据类型可以将XML的数据存储于数据库的对象中,在定义一个XML数据类型之前,尽管 Oracle XQuery,但在处理数据库中存储的结构化数据方面,SQL Server 2005中的XML数据类型,本文介绍了SQL Server

金沙国际唯一官网网址 25
FOR XML PATH

PATH形式提供了一种较轻巧的艺术来混合成分及品质。在PATH方式中,列名或列别称被看作XPATH表明式来管理,这么些表明式内定了何等将值映射到XML中。默许情状下,PATH形式为每同样自动生成

 

总结

本条白皮书仅用于提供音讯之目标。微软公司对那么些文件的音信不做任何保障、明示、暗意只怕法律相关义务。

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

注:删除主索引,与其连带的全数匡助索引也会被去除。由此地方语句中去除学生信息表索引后,协工学生音信表索引也被删除了。

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>
下,当然也得以来自分化。

100
SKING
AD_PRES

        return 

创制索引

为表中有些列成立索引,供给该列是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是一种特别复杂的语言,大家只是提到了一局地她的零部件,借使想要更上一层楼的接头它怎样使用,请查看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: 创造测验意况和数码

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;

        return 

XML查询技能

XML文书档案以一个纯文本的花样存在,主要用以数据存款和储蓄。不但方便人民群众客户读取和选拔,並且使修改和保险变得更易于。

  • 二个实例的XML列不可能包括超越2GB的数码。
  • 二个XML的列不可能是索引。
  • XML对象不能够使用Group By的子句中。
  • XML的数据类型不扶助比较和排序。

你能够看看,以上输出蕴含从 employees.xml 和 acc_dept.xml 中得到的职工
XML 元素,这几个要素表示薪水大于或等于 5,000 欧元的职员和工人。

身体力行:比较明确七个address节点的品类

尚未名称的列

上面介绍一种轻松的FOPAJERO XML PATH应用措施

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

询问结果如图所示
金沙国际唯一官网网址 1

注:假诺提供了空字符串FO奥迪Q7 XML PATH(‘’)则不会转换任何因素。

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

查询结果如图所示
金沙国际唯一官网网址 2
示例12:利用xmlTest表和mainTeacher表查询出xmlTest表中成就>=700分的上学的儿童的班老总消息和学员音讯,并转化成XML格式
XmlTest表数据如下图所示
金沙国际唯一官网网址 3
MainTeacher表数据如下图所示
金沙国际唯一官网网址 4
推行上边包车型地铁言辞

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

100
Steven King
1200


101
Neena Kochhar
1000

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

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

能够创造xml类型的变量,参数和列,只怕将XML架构会集和xml类型的变量、参数或列关联,这种景色下,xml数据类型实例称之为类型化xml实例。不然XML实例称为非类型化的实例。

总结

 

大家基本上领会了XML在SQLServer
中的轻巧利用,从概念到利用格局。也观察了query()检索子集,也能运用value()检索独立的要素属性的值。当然除外还应该有向exist(``)
andnodes()
那样方法,合作语法都是使用,那有个别就不再进行讲了,大同小异。有不知底的能够私聊。越来越多选择方式还请访问MSDN来收获(找寻XQuery
language reference)。

另一种能够断定拉长 XQuery
表达式推行质量的技巧是应用绑定动态变量。使用绑定变量(并不是将变量串联为字符串)能够使
Oracle 重用 SQL 语句,进而裁减分析费用并料定增加应用程序的特性。能够在
XMLQuery 和 XMLTable SQL 函数中运用 PASSING 子句将动态变量绑定到 XQuery
表明式。该技术使您能够依靠顾客端代码中总括的参数动态生成 XML。列表 3
中的示例演示了怎么在从 PHP 脚本推行的 XQuery 查询中选择绑定变量。

•        Idiv操作符。

FOR XML EXPLICIT

允许顾客显式地定义XML树的形状,不受AUTO情势中的各个限制。无法将FOPAJERO XML
EXPLICIT直接用在SELECT子句中。
示例11:将xmlTest表转变为XML格式(FO猎豹CS6 XML EXPLICIT)
XmlTest表的数量如图所示
金沙国际唯一官网网址 5

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

询问结果如图所示
金沙国际唯一官网网址 6
金沙国际唯一官网网址 7
在结果图中大家发现,红框中3个班级音信列在协同,而持有学员都列在高级中学一年级3班下,那不是大家想要的结果,我们意在各种班级对应本人的学员。那么哪些化解此类主题材料吧,那涉及到排序。

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

首先删除代码行末的FO索罗德 XML
EXPLICIT语句,仅仅推行剩下的有些,使结果以表格格局显示,那么结果如下
金沙国际唯一官网网址 8
那一个表格每行的依次也代表了该表格转化为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的代码作用是安显摆ML格式的,对数据排序没有影响。在底下多少个层级的赋值部分,每一个层级的代码中都对地点多少个层级的要素重复赋值,那样做使结果的表格中不再有那么多属性值是NULL,能够方便排序。最终再遵照成分[班级音讯!2!班级]和[学员信息!3!学号!Element]排序。让我们看看结果什么。
运作方面的代码,但不运维FO中华V XML
EXPLICIT语句,看看表格中数量内容和行顺序是不是改造
金沙国际唯一官网网址 9
如图所示,发掘行数据和学员数量的相继展现正确。运转具有代码获得XML文书档案,结果如图所示
金沙国际唯一官网网址 10
是因为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凯雷德 XML
EXPLICIT代码要留意,层级1的代码中先安装层级结构,不要先急着赋值。在下属层级的代码中对层级1中的代码进行赋值,最佳重复赋值,不然就会油但是生文中的排序难题。假若某些层级现身重复数据,在该层级的代码前加DISTINCT关键字。消除排序难点最棒的格局是对各种层级的属性重复赋值并在最后用O奔驰M级DER
BY按层级属性排序。

稳重观看地点的XML文档,开掘总分属性的值是个float类型,要把它转变来int,只须要把层级3中对总分的赋值代码改成CAST(年级总分
AS int)
金沙国际唯一官网网址 11

XML的数据类型确定保障了你的XML数据被完整的营造保存,同一时候也适合ISO的标准。在概念叁个XML数据类型在此之前,大家第一要明白它的二种范围,如下:

则 XQuery 表达式重回的空类别将与 purchaseorder
表联接,进而包蕴在询问总计果集中。实际上,那意味着输出将不仅仅蕴涵为客户EABEL 诉求的订单生成的 OrderTotal 成分,而且还含有为 purchaseorder
表中存款和储蓄的装有别的订单生成的空行(默许情状下,purchaseorder 表富含 132
行)。从结果集中清除空行的艺术之一是在 SELECT 语句的 WHERE 子句中应用
existsNode SQL 函数,并非在 XQuery 表明式中利用 WHERE 子句,如下所示:

示例:使用sql:variable()函数

FOLacrosse XML的嵌套查询

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

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方法,查询结果如下图所示
金沙国际唯一官网网址 12

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

接下去我们看看怎样定义一个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 表明式,您或然会注意到它迭代顶层 PurchaseOrder 成分,当中的种种PurchaseOrder 成分都意味着依据 PurchaseOrder XMLType
情势的表中的一行。那代表实际上海重机厂写 XQuery
表达式,以迭带基础对象表(用于存款和储蓄分解的 PurchaseOrder
文书档案)中的行。与查询要迭代不代表基础表中的单个行的 XML
成分相比较,该格局的习性更加好有的。

演示:转换表store中选定的音信的值

FOR XML RAW

将表转变来成分名称是row,属性名为列名或然列的别称。
示例9:将Student表转换为XML格式(FOLAND XML RAW)
Student表的多寡如图所示
金沙国际唯一官网网址 13
施行语句:

SELECT * FROM Student FOR XML RAW;

询问结果如图所示
金沙国际唯一官网网址 14
金沙国际唯一官网网址 15

概念一个XML变量

查询 XMLType 数据

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

XQuery简介

XQuery是一种查询语言,能够查询结构化或许半结构化的数量。SQL Server
二〇〇九中对XML数据类型提供了支撑,能够存款和储蓄XML文书档案,然后使用XQuery语言实行查询。

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

                </NewYork>

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表

查询结果如图所示
金沙国际唯一官网网址 16
双击展开查看XML

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

本人设定了变量的值,然后使用select
来搜寻那一个值。和大家想的一律,它回到了XML的文档。如下:

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

        else

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

询问结果如图所示
金沙国际唯一官网网址 17
点击查询结果
金沙国际唯一官网网址 18
如想询问标签

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

结果如图所示
金沙国际唯一官网网址 19

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

询问结果如图所示
金沙国际唯一官网网址 20

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

查询结果插入节点后新闻如图所示
金沙国际唯一官网网址 21

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

询问结果如下图所示
金沙国际唯一官网网址 22

本条例子通过运用DECLARE  评释去定义名称叫@ClientList
的变量,当本人注解变量的时候,只需求包罗XML的数据类型的名字在变量名后。

化解质量难点

                <StartDate>2001-10-01</StartDate>

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

结果如图所示
金沙国际唯一官网网址 23
在上述语句中,sp_xml_preparedocument存款和储蓄进程语句用了2个参数,当中@Student是七个int型变量,该存款和储蓄进程会将句柄存款和储蓄在@Student变量中作为结果数据,@StudentInfo是贰个XML类型的变量,存款和储蓄了将要进行剖析的XML文书档案。
OPENXML函数的言辞中,使用了3个参数,个中@Student代表已经经过sp_xml_preparedocument存储进程分析的文书档案的句柄,’/row’使用XPath情势提供了多个路子,代表要回去XML文书档案中该路径下的数码行,2是四个可选数据参数,表示将这一个数据行以成分为核心映射。

SQL
Server对于XML援救的骨干在于XML数据的格式,这种数据类型能够将XML的数额存款和储蓄于数据库的指标中,举例variables,
columns, and
parameters。当你用XML数据类型配置那几个目的中的三个时,你钦命项指标名字仿佛你在SQLServer
中内定一个档案的次序同样。

该查询将扭转以下输出:

上面譬喻表达了什么样利用replace value
of关键字来更新某一定应聘者的多个留存本领值。

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奥迪Q3ING数据类型技艺转变来XML。
XML列无法运用于GROUP BY语句中
XML数据类型存款和储蓄的数据不能够赶过2GB
XML数据类型字段无法被设置成主键也许外键或称为其一部分。
Sql_variant数据类型字段的运用不能够把XML数据类型作为种子项目。
XML列不可能钦命为独一的。
COLLATE子句不可能被使用在XML列上。
积累在数据库中的XML仅帮忙128级的层系。
表中最对只好具备三市斤个XML列。
XML列无法进入到法则中。
独一可使用于XML列的放置标量函数是ISNULL和COALESCE。
具备XML数据类型列的表不能够有四个当先15列的主键。

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

        return 

辅助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索引

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

那将转移以下输出:

集结函数

FOR XML子句

由此在SELECT语句中运用FORubiconXML子句可以把数据库表中的数据检索出来并生成XML格式。SQL Server
二零零六支撑FOLacrosseXML的八种情势,分别是RAW形式,AUTO情势,EXPLICIT方式和PATH情势。

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

        $A 

XML索引

由于XML数据类型最大可存款和储蓄2GB的数目,由此须求创建XML索引来优化查询品质。

在本文前边的询问 XMLType 数据部分中,您看见了一个关于使用 XQuery 将二个XML 文书档案转变为另二个 XML 文书档案的演示。具体来说,该示例使用 XQuery
表明式总计示例数据库情势 OE 的 purchaseorder
表中积存的订单的订单一共,然后为管理的每种订单生成了叁个 OrderTotal XML
成分。实际上,您能够利用 XSLT
实践同一操作。为此,您首先必要创建多个用到于 PurchaseOrder XML 文书档案的
XSLT 样式表,以更改对应的 OrderTotal 成分。对于此示例,能够行使列表 4
中所示的 XSLT 样式表。

exist()方法允许客商在XML文书档案中实施查询以确认一个XQuery表明式的结果是不是为空。当XQuery表明式重回四个非空的结果时,这一个方法的重回值为1;当表明式重临空时,方法重返值为0;当XML实例本人为NULL时,就回到NULL值。

FOR XML AUTO

动用表名称作为成分名称,使用列名称作为质量名称,SELECT关键字前边列的依次用于XML文书档案的等级次序。
示例10:将Student表转变为XML格式(FO昂Cora XML AUTO)
实行语句:

SELECT * FROM Student FOR XML AUTO;

查询结果如图所示
金沙国际唯一官网网址 24
金沙国际唯一官网网址 25

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;

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

根据关全面据创设 XML

到现在,让大家假如某先生对查看有“胸闷”和“腹部痛”症状的病例感兴趣。上面包车型大巴查询得到了百分百有“头疼”和“腹部疼”症状的病例。

接下去,假若您必要依靠 empsbonus.xml
文书档案中寄放的数目创设三个表格。在该报表中,您也许不只要含有列表中呈现的奖金多少以及种种职工的职工
ID,还要富含他/她的全名。由此,能够率先应用以下查询生成二个新的 XML
文书档案(借让你以 H昂Cora/H牧马人 的身份连接):

更加多消息:

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;

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

在骨子里情况中,以上的 XML
文件恐怕置于网址上(因而得以经过网络得到)、以文件方式积存在地面文件系统中,或以文件财富方式积累在
Oracle XML DB
消息库中。就本示例来讲,该文件位于网址上。为轻松起见,能够在目录(Web
服务器在中间存款和储蓄可从 Web
看见的文书档案)中创立三个职员和工人文件夹,然后在该文件夹中插入 empsbonus.xml
文件,以便可以经过以下 URL 访谈 empsbonus.xml 文件:

 

鉴于 帕杰罗SS 音信提供精神上是多少个托管的 XML 文件(瑞虎SS
音讯阅读器从当中获得头条新闻或任何剧情),由此得以像管理别的别的能够通过
Web 获得的 XML
文书档案那样来管理它。正如您在本文前边的查询外界数据源部分中所见,可以选取XQuery 查询任何可以因而 UHighlanderL 访谈的 XML。您通过 XMLTable 和 XMLQuery SQL
函数中的 PASSING 子句动态绑定全体外界 XML 数据源。以下是二个查询 奥迪Q3SS
消息提供的 XQuery 示例:

下边包车型客车询问得出了JobCandidateID等于3的应聘者的具备address类型节点值不等于Home的要素:

上述查询是二个有关如何行使 XQuery 基于 XML 和非 XML
数据(以不一样的主意从区别的数据源中检索)生成 XML
文书档案的演示。具体来说,使用 ora:view() 函数访谈 HR 演示方式中的暗许
employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于
HTTP 访谈 empsbonus.xml 文书档案。然后,在 FLWOR 说明式的 return
子句中创设新的 XML 文书档案。最终,将赢得以下 XML 文书档案:

AS

将 XML 分解为关周全据

FROM [HumanResources].[JobCandidate]


100
King
24000


101
Kochhar
17000


102
De Haan
17000

你能够采纳节点比较运算符来明确2个节点是还是不是代表同样类节点。节点相比运算符是二元操作符,每一个操作元都以node类型。

正文提供的亲自过问不仅仅示范了在哪些场馆下以及哪些行使 XQuery 查询、营造和改造XML,并且还亲自去做了如何监督和分析 XQuery
表明式的性质试行,从而找到更火速的点子来拍卖同一工作负荷。

SELECT @Weather.query(\’

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

 

该组织应生成以下输出:

XQuery是一种用于XML查询的新语言,援救基于XPath2.0的数据浏览和征集。本章节为大家最初显示了XQuery语言各方面包车型大巴源委,例如XQuery和XPath之间的涉嫌,XQuery的帮助和益处,XQuery的应用领域,XQuery中XML
Schema的平整等等。

但在支付实际应用程序时,您将很或然必要 XQuery 表明式直接生成 HTML
标志,实际不是单独转移三个如上所示的 XML
文书档案。那样,您便能够创设叁个越来越灵敏、可维护性更加高的应用程序,原因是在这种情景下,全部Mercedes-EQSS 处理(从提取供给的数目到将它包裹在 HTML
标志中)都将改换来数据库。那使您不要编写负担 君越SS
管理的应用程序代码。实际上这表示你不用在举个例子 XC90SS
信息提供的构造早就退换的意况下修改应用程序代码。相反,您只需修改用于 本田UR-VSS
管理的 XQuery 表达式。

引用:

将列表 4 中的 orderTotal XSLT 样式表与查询 XMLType
数据部分中的示例使用的 XQuery 表明式进行比较,您只怕会小心到,XQuery
方法要比 XSLT 方法更具吸重力。起码在运用 XQuery
时,您只需编写少之甚少的代码就可以获得一致的终极结果。

                <EndDate>2003-05-09</EndDate>

所挑选的储存模型并非是震慑 XQuery
表明式实行品质的独一因素。在少数情状下,XQuery
表明式自个儿的构造也说不定产生品质难题。要监察和控制 XQuery
表明式的属性,能够打字与印刷并检查关联的 EXPLAIN PLAN。在 SQL*Plus
中,只需安装 AUTOTRACE 系统变量,就能够打字与印刷 SQL
优化程序行使的奉行路径。但要执行该操作,请确定保证创设 PLUSTRACE
剧中人物,然后将其授予连接到数据库所运用的顾客。有关如何推行此操作的音讯,请参阅
Oracle 数据库 10g 第 2 版 (10.2) 文档中《SQL\Plus
顾客指南和参照他事他说加以考察》一书中的“调整SQL\Plus”一章。以下示例演示了什么样通过检查 EXPLAIN PLAN
生成的实施陈设来获得利润。假如你曾经将 PLUSTRACE 剧中人物赋予默许顾客 OE,以
OE/OE 的身价登陆并运维以下查询:

WHERE JobCandidateID = 2

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

SELECT Resume.query(‘

但在有个别情状下,很难发现 XQuery
表明式的哪个构造将使少数查询的属性越来越好。那正是怎么最佳在开辟阶段使用调度工具的案由。

SET @EducationLevel = ‘Bachelor’

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;

内容目录

102
De Haan
17000


7839
KING
5000


100
King
24000


101
Kochhar
17000

 

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

XML数据的修改

该查询应生成以下输出:

        declare namespace
RES=””;

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



























 

XQuery 与 XSLT

‘) as Result

你只怕对为上述查询生成的推行安顿并不称心。特别是,所拍卖的行数恐怕那些大。由于
SQL
调节的珍视目的是幸免访谈对结果未有任何影响的行,因而只怕要继续调节查询以优化品质。对查询中包罗的
XPath 表明式举行双重新建构模后,能够另行重试它,如下所示:

          {

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;

下边包车型客车查询对JobCandidateID等于3的应聘者所从事过的生意依据其行事时间开展了升序排序。

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

‘) as Result

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;

                <Temp Date=”2004-11-04″ High=”52″ Low=”45″ />

http://localhost/employees/empsbonus.xml

‘) as Result

查询 安德拉SS 新闻提供

和别的函数语言同样,XQuery支持if-then-else语句。你能够动用if-then-else语句来落实基于条件表明式重回值的操作。

以上查询将处理客户 EABEL 央求的享有订单(即存储在 XMLType 的默认PurchaseOrder 表中的订单)并将转移与查询 XMLType 数据部分中的 XQuery
查询同一的输出。

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

          }

询问外界数据源

DECLARE @result xml

你已经在本文掌握到,XQuery
是三个归纳的询问语言,它提供了一种用于查询、塑造和更改 XML
数据的高效方法。尽管 Oracle XQuery 实行令你能够操作任何可以用 XML
表示的数码(无论它存款和储蓄在数据库中、位于网址上依旧存储在文件系统中),但将管理的多寡移动到数据库中一直是二个没错的主意。对于数据库中蕴藏的数目,Oracle
XML DB(对 XPath
重写使用同一机制)只好眼看优化管理这一个基于以下数据创设的 XQuery
表明式:那么些数据包涵关周全据、对象-关周到据或接纳结构化(对象-关系)存款和储蓄技艺存款和储蓄的依据XML 形式的 XMLType 数据。

        </InsuranceInfo>

列表 3:使用绑定变量

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

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

设若参照表明式(表明式2)无法静态地方统一规范识有些节点,那么插入操作退步,并赶回一个静态错误。

(小编:铭铭)

        $A 

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

归来数据库首页

        where $ED/RES:Edu.GPA =
max(/RES:Resume/RES:Education/RES:Edu.GPA)

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

 

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

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

运用 XQuery,能够依据 XML 数据以及能够用 XML 表示的非 XML 数据生成 XML
文书档案,无论其义务怎么:无论是存款和储蓄在数据库中、置于网址上、即时创制或然存款和储蓄在文件系统中。但要注意,Oracle
XML DB 为针对数据库中积累的数据开展的 XML
操作提供了非常高的品质和可伸缩性。由此,若是你能够统统调控所管理的数目,则最佳将它移动到数据库中。

                { $EMP/RES:Emp.JobTitle }

为便利起见,您大概要求将此 XSL
样式表保存在数据库中,然后再起始使用它。举个例子,您可以将样式表作为文件能源保存在
Oracle XML DB
新闻库中。施行该操作的秘籍之一是将样式表作为文件保留到地头文件系统中,然后利用以下有个别网络球组织议将它移动到
XML 新闻库:FTP、HTTP 或 WebDAV。假如你曾经将列表 4 中的 XSLT 样式表作为
orderTotal.xsl 保存在 /public
新闻库文件夹中,未来得以按以下示例所示将它用作 XMLTransform SQL
函数的参数(要是你以 OE/OE 的身价登陆):

原稿地址:

要获得一致的终极结果,能够改用 XMLQuery 函数。但假设将上八个演示中选用的
XQuery 表明式参数传递给 XMLQuery(如下所示):

 

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

        return 

在 Oracle 数据库 10g 第 2 版中,Oracle
引进了三个与该数据库集成的全职能自带 XQuery
引擎,该引擎可用以达成与支出支持 XML 的应用程序相关的各样职分。XQuery
是一种用于拍卖 XML 数据模型的查询语言,它实质上可操作任何项目标可用 XML
表明的数据。尽管 Oracle XQuery
施行让你可以运用数据库数据和外界数据源,但在管理数据库中存放的结构化数据方面,Oracle
XML DB 日常能够肯定拉长品质。

          }

在列表 1 中的第三个 PL/SQL 进程中,您只是在 XML
信息库中创设了三个新文件夹。在该音信库文件夹中,您随后将积累此处展现的第叁个PL/SQL 进度中开创的 XML 文书档案。第三个 PL/SQL 进程首首发出 SELECT
语句,该语句使用 XMLQuery SQL 函数基于关周全据创设 XML。对于 XQuery
表达式(XMLQuery 在此地将其充作参数)来说,请留意嵌套的 FLWOKuga表明式中利用的 ora:view XQuery 函数。在该示例中,ora:view
获取八个输入参数,即“HQX56”和“employees”,它们提示该函数查询属于 HPAJERO数据库情势的职员和工人表。因而,ora:view 将回来贰个象征 H福睿斯.employees
表行的职工 XML
文书档案连串。但为了节省结果文书档案中的空间,只将前五个职工记录传递给结果类别。那是经过在
FLWOPAJERO 表明式的 where 子句中钦点 $i/EMPLOYEE_ID <= 102
而完成的。请留意 FLWOLX570 表达式的 return 子句中央银行使的 xs:string()
xs:integer() XQuery 类型表明式。实际上,此处使用的这五个 XQuery
表明式不仅仅将 XML
节点值调换为对应的等级次序,并且还将提取那么些节点值。随后,生成的职员和工人 XML
文书档案作为 employees.xml 保存到之前在列表 1 中另一个 PL/SQL 进程中开创的
/public/employees XML 音信库文件夹。要力保此操作已成功,可进行以下查询:

 

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

SET @result =
‘<Result />’

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

 

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

WHERE JobCandidateID = 2

该 XQuery 应生成三个 XML 文书档案,当中累积 Oracle 能力网 (OTN) 近年来公布的与
PHP 手艺有关的头条音讯列表。所生成的 XML 文书档案也许如下所示:

示例:使用position()函数

正如您从眼下的亲自过问中询问到的,在 Oracle XQuery 实施中,doc 和 collection
XQuery 函数用于访谈 Oracle XML DB 音讯库中蕴藏的 XML 文档。能够通过
XMLTable 和 XMLQuery SQL 函数中的 PASSING
子句动态绑定外界数据源。思量以下示例。若是你的信用合作社要为这个从事于 XQ
项指标职工付出奖金。因而,财务部公布了 empsbonus.xml
文件,其中包括有资格获得奖金的职工列表以及该列表中输入的每一种职员和工人的奖金数额。empsbonus.xml
文件大概如下所示:

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

只要应用程序管理关周密据而非 XML,而你要求拜望的数额以 XML
格式存款和储蓄,则将 XML
分解为关周详据可能会相当有效。继续拓宽上一些的示范,您能够运用 SQL
函数 XMLTable 将职工 XML 成分分解为虚拟表的单个列,如下所示:

        declare namespace
RES=””;

尽管 Oracle 在 Oracle XML DB 中提供了多少个自带 XSLT
管理器,但在众多状态下(尤其是在拍卖大型文书档案时),XQuery 对于创设 XML
更连忙。另外,XQuery 表明式常常比为同一作业设计的 XSLT
样式表更具可读性,而且更领会。与 XSLT 同样,XQuery 不但可用来将一个 XML
文书档案调换为另多少个 XML 文书档案,并且还可用以将 XML
转换为另一种基于文本的格式,如 HTML 或 WML。

                <MasterDegree>MS</MasterDegree>    

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

SELECT JobCandidateID, Resume

在急需的场合下(举个例子,向 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 文书档案。

        WHERE JobCandidateID = @JobCandidateID

正如本文以前(参阅使用关周到据创设 XML部分)介绍的演示所示范,使用
fn:doc 特别轻巧直接。它拿走表示音讯库文件能源 (UXC90I) 的字符串并重回该 U索罗德I
指向的文书档案。要询问 fn:collection XQuery
函数的功能,同一文件夹中足足应当七个音讯库文件。假设已经运维了列表 1中的代码,则已经创立了 /public/employees 音信库文件夹并在里头存款和储蓄了
employees.xml 文件。由此,您将急需在该公文夹中起码再创立一个 XML
文件,然后本事试用 fn:collection。列表 2 中的 PL/SQL 代码基于
SCOTT/TIGE本田UR-V 演示数据库方式的 dept 和 emp 表存款和储蓄的关周详据构建XML,然后将转变的 XML 文书档案作为 acc_dept.xml 保存到 /public/employees
消息库文件夹。要运转列表 2 中的 PL/SQL 进度,请确定保障以 SCOTT/TIGE奥迪Q7的身价登陆。

上面包车型大巴询问得出了JobCandidateID等于3的应聘者的从事经历。

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

•       
使用递增定义,如[1]依旧FLWOEnclave来制止不当相称基数而形成的静态错误。

此时,/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 // 构造:

FLWO昂Cora表明式中的for语句援救客商定义三个变量来遍历某些输入类别。该输入类别能够应用XPath表明式、原子值类别、分隔符类别或结构化函数。因此,这里的for语句与SQL
SELECT FROM语句看似,但与编制程序语言中的“for”语句不相同。

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

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

在上述示例中,您在 XMLTable 函数的 PASSING 子句中使用 OBJECT_VALUE
虚构列将 purchaseorder 表作为左右文项传递给此间使用的 XQuery
表明式。XQuery 表明式总计顾客 EABEL
要求的各类购买订单的一共,并为管理的每一个订单生成一个 OrderTotal XML
成分。要访问生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE
设想列。最后的输出应如下所示:

                { $EMP/RES:Emp.StartDate }

在以上 XQuery 中,fn:doc XQuery 函数用于访谈 Oracle XML DB
消息库中蕴藏的单个 XML 文档。但倘诺要拍卖部分装有一样或貌似结构的 XML
文书档案(存款和储蓄在同一 XML
音信库文件夹中),应该如何是好?这种气象下,另八个用于拍卖 XML
讯息库财富的 XQuery 函数(即
fn:collection)或然会派上用场。本文稍后将介绍多少个有关如何利用
fn:collection XQuery 函数的言传身教。

END

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

xs:TYPE实例

100
1200


101
1000

 

正如你从眼下的一部分中打探到的,XQuery 是一种用于查询 Oracle 数据仓库储存款和储蓄的
XML 内容的登时方法 – 无论你是管理地方存款和储蓄的 XMLType
数据或许查询基于关周全据营造的 XML
视图。但依靠对数据利用的储存类型的不等,XQuery
表明式的实践质量或许天冠地屦分化。尤其是,Oracle XML DB 能够优化基于由
ora:view 函数成立的 SQL/XML 视图而营造的 XQuery 表达式。对于 XMLType
表或列中寄放的 XML 数据,只好对应用结构化(对象-关系)存款和储蓄技能存款和储蓄的基于
XML 形式的 XMLType 数据开展 XQuery 优化。

                        <AvgLow>{
avg(/WeatherInfo/Boston/Temp/@Low) }</AvgLow>

        /RES:Resume/RES:Education[RES:Edu.Level=”Bachelor” and
RES:Edu.Major=”Business”]

CREATE TABLE [CandidateInfoXMLDataType]

 

        declare namespace
RES=””;

          }

你可以行使insert关键字在XML文书档案中插入多少个节点。Insert关键字接受XQuery表明式标志的待插入的节点,并辅助XQuery表达式来标志插入地点的参谋节点。

XQuery的操作

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

 

 

        declare namespace
RES=””;

引用:

数学生运动算符

 

WHERE JobCandidateID = 2

        return

                { $EMP/RES:Emp.OrgName }

隐式类型转变

•        string-length() 计算字符串的长度. 

‘) as Result

引用:

            <Item>Pepto-Bismol</Item>

 

•        如若您想依附一个简约表达式对结果集实行排序,那么可以利用order
by语句落成。

语法:

 

‘) as Result

‘) as Result

•        在FLWO奥迪Q5语句中加进了order by语句,它能够对文书档案数据开展双重排序。

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

XQuery应用场景

•        数学生运动算

        declare namespace
RES=””;

引用:

        </Boston>

最后,count()函数再次来到种类中节点的多少。

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

AND
AssetDetails.exist(‘/AssetInfo/SystemInfo/OS/text()[contains(.,”Windows
XP”)]’) = 1

WHERE Resume.exist (‘

 

一级施行和指引方针

品类检查表明式

                element AnnualRevenue {
string((/ST:StoreSurvey/ST:AnnualRevenue)[1]) }

示例:使用sql:column()函数

             StoreAreaInSqMeters = “{ $S/ST:SquareFeet*0.0929  }”>

示范:相比非常多少个address节点的逐一

                </NewYork>

    <Name>Robert</Name>

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

          {

示例:使用contains()函数

END

‘) as Result

                element EndDate { $ED/RES:Edu.EndDate cast as xs:date?
},

XQuery表明式的构造

节点顺序比较运算符

return

XQuery使用XPath2.0表明式查找三个文书档案中的节点,在一个文书档案中移动节点照旧在文书档案间活动节点地点。定义移动路线的XPath是三个并行分离的步子组成的雷打不动队列。每二个手续富含叁个axis,三个node
test和多个步骤决断。

 

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

•        ns 是命名空间前缀。

•        不协助从表面导入schema。

<JobCandidate>    

 

        declare namespace
RES=””;

WHERE JobCandidateID = 3

在有着别的案例中,推荐应用XPath表达式。

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

AND
AssetDetails.exist(‘/AssetInfo/SoftwaresInstalled/Software/text()[contains(.,”Office
2000″)]’) = 1

语法:

        @JobCandidateID [int],

•        允许顾客自定义函数(SQL Server 2006中不协助)。

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

SELECT @Result.query(\’

FLWO奥迪Q5表明式中选拔Where语句能够筛选二个迭代的结果。

FROM [HumanResources].[JobCandidate]

Microsoft和ActiveX是微软公司在U.S.和/或任何国家(地区)的注册商标或商标。

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

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

当Schema是不可见的时候,非类型化的XML就很有用。当Schema可见,但它的转移比比较快乃至于很难保险的时候,或然当存在多个Schema,最终的绑定决议于外界的需求时,非类型化的XML也很有用。其它,当XML
Schema中包蕴数据库引擎不扶助的XML
Schema结构时,非类型化的XML也很有用。在那些景况下,你可以应用在集体语言运转时(CL库罗德)客商自定义功能中的System.XML验证器来提供实惠验证。

对照起在客商端管理XML进程,在劳务器端使用XQuery来拍卖XML进程要全部越多的亮点。当中一部分独到之处能够总计如下:

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

上边包车型大巴蕴藏进程允许顾客插入特定应聘者的有个别新技艺。本存款和储蓄进程选用sql:variable()函数来走访XML
DML语句中的Transact-SQL变量。更加的多关于怎么着在XML中绑定非XML关系型数据的剧情,参见《关系型列和变量的拜见》(Accessing
Relational Columns and Variables)。

•       
品质的考订:在劳务器端使用XQuery写的查询语句能够选拔SQL查询器进行优化。那样优化管理的脾气要压倒在顾客端重新获得多少并开展数据过滤。其余,还足以经过为XML数据类型的列成立索引来得到越来越强有力的性质。

<PatientRecord>

                  string($EMP/RES:Emp.JobTitle) )

•        统一能源标志的函数和操作符(functions and operators for
anyU奥德赛I): resolve-uri()。

WHERE
PatientRecord.exist(‘/PatientRecord/ProblemDetails/Symptoms/Symptom/text()[contains(.,”Fever”)]’)
= 1

•        不扶助分化种类连串的串联,如节点和多少。

 

演示:使用贰个原则表明式

        declare namespace
RES=””;

AS

 

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

示例:使用concat() 和substring()函数

上边包车型地铁查询利用avg()函数计算了纽约和达Russ的每一周平均最高和压低的温度。

FROM [HumanResources].[JobCandidate]

        ‘)

•        错误函数(error function): fn:error().

•        体系的函数和操作符(functions and operators on sequences):
fn:boolean(), fn:index-of(), fn:exists(), insert-before(), remove(),
reverse(), subsequence(), unordered(), zero-or-one(), one-or-more(),
exactly-one(), deep-equal(),two-argument version of id(), idref(),
doc(), collection()函数和聚合, intersect和except 操作符。施工方案 –
使用not(not()) 代替fn:boolean(),使用 not(empty())替代fn:exists().
使用重复认证代替zero-or-one(),使用[1]代替exactly-one()。

 

下边的询问创制了三个XML文书档案,数据来源于非XML类型的列Name和CustomerID,还来自XML类型的列德姆ographics中的成分YearOpened、NumberOfEmployees、AnnualSales和AnnualRevenue。

FROM [HumanResources].[JobCandidate]

XQuery表达式的构造

示例:使用min()函数

 

波及项目表明式

示例:使用count()函数

   Expression1 

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

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

近期,让我们只要工作单位的培养磨练机构正在扩充一个ASP.NET培养磨练,并期待邀约全数须要培植的职工参与ASP.NET的培养课堂。下边包车型大巴询问选取了独具在议论纷纷进度中规定要求接受ASP.NET培养陶冶的干部。

SELECT PatientID, PatientRecord.query(‘

FROM [HumanResources].[JobCandidate]

        else

WHERE JobCandidateID = 2

        <NewYork>

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

WHERE JobCandidateID = 2

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

Microsoft
可能已持有与本文书档案中涉及的主旨相关的专利、专利申请、商标、版权或任何知识产权。除非获得Microsoft
的显眼书面许可公约,提供本文书档案并不表示给予使用这几个专利、商标、版权或其余文化产权的任何许可。

 

SQL Server 二零零五支撑对存款和储蓄在数据库中的XML数据开展修改。最近,W3C
XQuery专门的学问草图还尚无为XML文书档案的更换定义三个规范。为了提供修改XML文书档案的协助,微软研究开发了XML数据修改语言(XML
Data Modification
Language  DML)。XML文书档案能够应用XML数据类型的modify方法修改,何况能够利用XML
DML语句钦命修改。

        order by $EMP/RES:Emp.StartDate

        WHERE JobCandidateID = @JobCandidateID

上面包车型地铁询问利用min()函数得出了GPA值最小的education节点。

 

        declare namespace
RES=””;

CREATE PROCEDURE [InsertSkillInfo]

花色注解表明式

如for语句中的xs:TYPE

      </PrescriptionDetails>

                element EndDate { string($EMP/RES:Emp.EndDate) },

        declare namespace
RES=””;

        delete (/JobCandidate/Skills/Skill[.=sql:variable(“@Skill”)])

XQuery应用场景

insert 

XQuery的优点

                <Symptom>Dehydration</Symptom>

•       
索引的使用:要是您要利用繁琐的XPath表明式来询问,就创办一个PATH索引。当XQuery查中的X帕特h说明式使用模糊路径(e.g.,
/a/* or
//b)来询问成分也许性质时,就应用一个VALUE索引。当查问中包蕴对XML文档实行某已知属性的有着节点查询的时候,就选拔PROPERTY索引。

引用:

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

          {

 

FROM [HumanResources].[JobCandidate]

 

                <PhoneNumber>9870909023</PhoneNumber>    

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

显式类型转变

您能够选用前后文函数来博取某上下文节点的上下文关系属性。SQL Server
二〇〇六中完毕了五个左右文函数—last() 和
position()。last()函数能够规定贰个系列中节点的数目,而position()函数能够猎取贰个上下文节点的职位。不容争辩,在SQL
Server 200第55中学,last() 和
position()函数只好被各节点间事关独立的上下文使用。

        return

‘) as Result

        $EMP 

 

SQL Server 二〇〇五中XML数据类型实现了ISO
SQL-二零零四口径XML数据类型。它不只能够存款和储蓄结构能够的XML1.0文书档案,也能储存根节点为文本的所谓的XML内容段落,也能积攒包括自由数目根成分的故事情节。针对具有卓绝格式数据的反省已经成功,这个检查不必把XML数据类型绑定到XML
Schemas。那多少个从没优良格式的多少不能被检查。

SELECT Resume.query(‘

•        字符串管理函数(string-handling functions):
codepoints-to-string(), string-to-codepoints(), compare(),
string-join(), normalize-space(), normalize-unicode(), upper-case(),
lower-case(), translate(), escape-uri(), starts-with(), ends-with(),
substring-before(), substring-after(), matches(), replace(),
tokenize()。

FROM [Assets]

          <StoreDetails

示例:使用“as xs:TYPE”语句

SELECT Resume.query(‘

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

字符串的拍卖

        where contains($Skill, “ASP.NET”)

演示:使用常量表明式

SELECT Resume.query(‘

引用:

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

        declare namespace
RES=””;

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

 

                </Boston>

          element EmpID { data($PA/Employee/EmployeeID) },

        @JobCandidateID [int],

        </Employement>

                <Temp Date=”2004-11-04″ High=”52″ Low=”45″ />

上边查询比较了2个address节点,分明它们在XML文书档案中是还是不是意味长期以来类节点。

XQuery简介

 

          <Employment>

示例:使用data()函数

                <Skill>SQL</Skill>      

 

        UPDATE [CandidateInfoXMLDataType]

</WeatherInfo>’

 

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

        return 

 

演示:使用动态数据

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

•        不扶助无边界的保留条件。

        as last

        </WeatherInfo>

 

/* Stored procedure to delete a specified skill element for a candidate
*/

             RevenueInYen = “{ $S/ST:AnnualRevenue*106.8100  }”

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

        where xs:decimal( data($ED/RES:Edu.GPA) ) ge 3.8 

数值相比较运算符

                <Address1>34 181st Place SE</Address1>      

下边包车型地铁询问得出了JobCandidateID等于3的应聘者简历中具有的address节点成分。

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