首页计算机计算机软件空间数据库与SQL 10 第10章 SQL Server 2008与XML.pptx

10 第10章 SQL Server 2008与XML.pptx

页数:47页文件大小:1.22 MB来源: 空间数据库与SQLppt课件

本课件先介绍XML的语法规则、文档结构与实体引用,讲解XPath常用表达式与路径实例,随后说明SQL Server 2008中xml数据类型的用法、FOR XML查询结果的生成以及XQuery的基本检索操作。

10.1 XML概述章节封面,标示本章主题与所涵盖的小节:10.1 XML概述;10.2 XML在SQL Server
XML简介XML的前身是SGML,是自IBM从60年代就开始发展的GML(Generalized MarkupLan
本小节将从一个简单的XML实例开始介绍XML的语法
查看本课件的文字版(共 47 页,供检索与复制)

第1页:10.1 XML概述1

10.1 XML概述10.2 XML在SQL Server 2008中的应用

第2页:10.1.1 XML简介

10.1.1 XML简介XML的前身是SGML,是自IBM从60年代就开始发展的GML(Generalized MarkupLanguage)标准化后的名称。SGML是一种非常严谨的文件描述法,导致过于庞大复杂,难以理解和学习,进而影响其推广与应用。作为SGML的替代品,开发人员采用了超文本标记语言HTML,用于在浏览器中显示网页文件。

但是HTML也存在一些缺点,HTML缺乏可扩展性,不同的浏览器对HTML的支持也不一样。HTML中只有固定的标记集,用户无法自定义标记,这极大地阻碍了HTML的发展。1996年,一个工作小组在W3C(万维网协会)的支持下,创建了一种新的标准标记语言XML,用于解决HTML和SGML的一些问题。

XML是一种标准化的文档格式语言,它使得发布者可以创建一个以不同方式查看、显示或打印的文档资源。XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身。而HTML是用来定义数据的,重在数据的显示模式。

另外,XML是可扩展的,因为它提供了一个标准机制,使得任意文档构造者都能在任意XML文档中定义新的XML标记,这使得综合的、多平台的、应用到应用的协议的创建降低了门槛。

第3页:节将从一个简单

本小节将从一个简单的XML实例开始介绍XML的语法,实例代码如下:<?xml version="1.0" encoding="ISO-8859-1"?><note><to>wang</to><from age="20">zhang</from><heading>Reminder</heading><body>Don't forget me this weekend!</body><number>12</number></note>

第4页:XML实例代码说明

在上述语句中,第1行“<?xml version="1.0" encoding="ISO-8859-1"?>”中指定了XML的版本(1.0)和编码格式(ISO-8859-1)。第2行开始是XML的主体部分,采用树状结构,以标签的形式存储数据。XML文档必须包含一个或一个以上的元素。

例如,“<to>wang</to>”称为一个元素,其中,“<to>”称为标签,每个标签都必须成对出现,如“<to></to>”,标签之间的数据“wang”为元素的内容。元素和元素之间有一定的层次关系,每个元素可以依次包含一个或多个元素。

其中,有一个元素不能作为其他元素的一部分,这个元素称为文档的根元素,即上述语句中的“<note>”标签。一个XML文档有且只能有一个根元素。

根元素“<note>”下面包含了“<to>”、“<from>”、“<heading>”、“<body>”、“<number>”5个子元素,分别表示标签的接收人、发送人、主题、内容和编号。值得注意的是,在上述语句中,所有的标签名称都是自己定义的。

这一点和HTML不同,HTML中都是预定义的标签,而XML允许用户定义自己的标签和文档结构。XML文档中的元素还可以带有若干个属性,属性的名称也是由用户自己定义的,属性的值必须添加引号。格式如下:<标签名属性名="值"…>元素内容</标签名>文件中的“age="20"”即为元素的属性和值。

第5页:XML文本时

在编写XML文本时需要注意以下几点:XML标签的名称可以包含字母、数字及其他字符。不能以数字或标点符号开始;不能以字符“xml”、“XML”或“Xml”等开始;不能包含空格。

XML语法是区分大小写的,所以在定义XML标签时必须保持大小写的一致性,例如,打开开始标签为“<head>”,结束标签为“</Head>”就是错误的写法。

XML必须正确地嵌套,例如,以下的标签嵌套关系是错误的:<b><i>This text is bold and italic</b></i>必须修改为<b><i>This text is bold and italic</i></b>XML文档中允许空元素的存在,所谓的空元素就是只有标签没有实际内容的元素,空元素有两种表示方法,例如“<a></a>”或“<a/>”。

在XML文档中所有的空格都会被保留。可以在XML文档中写注释,注释形式与HTML中一样,例如,<!--这是注释内容-->

第6页:XML中的实体引

XML中的实体引用。在XML文档中有一些字符具有特殊意义,例如,把字符“<”放在XML元素中会出错,因为解析器会把它当作新元素的开始。为了避免错误,需要用其对应的实体引用来表示。XML中有5个预定义的实体引用,如表10.1所示。实体引用符号名称&gt;>大于号&lt;<小于号&amp;&连接符&apos;'单引号&quot;"双引号

表10.1 XML中的实体引用:下表列出相关数据。

表10.1 XML中的实体引用
名称符号实体引用
大于号>&gt;
小于号<&lt;
连接符&&amp;
单引号'&apos;
双引号"&quot;

第7页:10.2.1 XML数据类型用户

10.2.1 XML数据类型用户可以将XML架构的集合与XML类型的变量、参数或列关联起来。在这种情况下,XML数据类型实例称为“类型化”的XML实例,否则称为“非类型化”的XML实例。

虽然在SQL Server 2008中可以像其他数据类型一样使用XML数据类型,但是使用时还是存在了一些限制,如下所示:XML数据类型实例所占据的存储空间大小不能超过2 GB;XML列不能指定为主键或外键的一部分;不能用做sql_variant实例的子类型;

不支持转换或转换为text或ntext,请改用varchar(MAX)或nvarchar(MAX);不能用在GROUP BY语句中;不能用做除ISNULL、COALESCE和DATALENGTH之外的系统标量函数的参数;

【例10.1】在PXSCJ数据库中

在PXSCJ数据库中创建一个表Xmltable,表中包含两列:Name和Content,分别存储XML文件名和XML文件的内容;定义一个XML类型的变量并赋值。

第8页:建表Xmltable的T-SQL语句

创建表Xmltable的T-SQL语句,如下所示:USE PXSCJGOCREATE TABLE Xmltable(Namechar(20)NOT NULL PRIMARY KEY,ContentxmlNULL,)定义XML类型变量的T-SQL语句,如下所示:DECLARE @doc xmlSELECT@doc=N'<XMLdata><name>note.xml</name><content>Hello!</content></XMLdata>'

第9页:XML数据的方法

导入XML数据的方法一般有两种。1.使用INSERT语句直接插入可以使用INSERT语句将XML数据以字符串形式直接插入XML类型列中。

【例10.2】向例10.1新建

向例10.1新建的表Xmltable中插入一行包含XML数据的记录,示例数据为之前定义的note.xml文件的内容。 INSERT INTO Xmltable VALUES('note.xml', '<note><to>wang</to><fromage="20">zhang</from><heading>Reminder</heading><body>Don&apos;t forget me thisweekend!</body></note>')

第10页:2.使用行集函数

2.使用行集函数OPENROWSET语句当XML文件的内容很多时,直接插入的方式显然不太合适。这时可以使用行集函数OPENROWSET来完成。OPENROWSET函数返回一个表,可以在查询的FROM子句中像引用表名那样引用OPENROWSET函数。

将OPENROWSET函数返回的内容用做INSERT或MERGE语句的源表,就可以将数据文件中的数据导入到SQL Server表中。

OPENROWSET函数的语法格式:OPENROWSET( BULK 'data_file', { FORMATFILE = 'format_file_path' [ <bulk_options> ]| SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB })

第11页:OPENROWSET BULK导入

与SELECT一起使用的FROM子句可以调用OPENROWSET(BULK...)而非表名,同时可以实现完整的SELECT功能。带有BULK选项的OPENROWSET函数在FROM子句中需要使用AS子句指定一个别名。

也可以指定列别名,如果未指定列别名列表,则格式化文件必须具有列名,指定列别名会覆盖格式化文件中的列名,例如,SELECT … FROM OPENROWSET(BULK...) AS table_aliasSELECT … FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)

【例10.3】假设note.xml文件保存

假设note.xml文件保存在D盘根目录下,使用OPENROWSET函数将该文件导入到数据表Xmltable中。插入数据使用如下语句: INSERT INTO Xmltable(name, content) SELECT 'note2.xml' AS name, *FROM OPENROWSET(BULK N'D:\note.xml', SINGLE_BLOB) AS note

第12页:图10.1 查询Xmltable数据

XML数据插入后可以使用SELECT语句查看插入了哪些数据:SELECT * FROM Xmltable结果如图10.1所示。图10.1查询表中XML数据

第13页:OPENROWSET函数

另外,OPENROWSET函数还可以用于插入图片文件、文本文件、Word文件、Excel文件等内容。这里以插入图片文件为例,具体的操作步骤如下。

  • 建立测试表USE PXSCJGOCREATE TABLE Test(TestID int IDENTITY(1,1),BLOBName varChar(50),BLOBData varBinary(MAX))
  • 使用OPENROWSET函数将图片文件导入数据库表字段INSERT INTO Test(BLOBName, BLOBData)SELECT 'picture', BulkColumnFROM OPENROWSET(Bulk 'D:\picture.jpg', SINGLE_BLOB)AS BLOB

第14页:图10.2 查询图片数据

(3)查询导入数据若上述脚本执行成功,则可以通过下述查询语句来查询表BLOBTest中插入的数据:SELECT *FROM Test执行结果如图10.2所示。图10.2查询图片数据

第15页:1.XPath

1.XPath语法XPath是一种在XML文档中查找信息的语言,使用XPath的标准路径表达式可以在XML文档中选取相应的XML节点。在XPath中有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释和文档(根)节点。

例如,在之前创建的note.xml文件中,“<note>”是根节点,“<to>wang</to>”是元素节点,“age="20"”是属性节点。XPath是根据路径表达式在XML文档中查找信息的,其路径表达式与Windows的文件路径类似。

可以把XPath比成文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点。XPath中常用的基本表达式在表10.2中列出。表10.3中给出了一些XPath中路径表达式的实例。

第16页:表达式选取此节点

描述表达式选取此节点的所有子节点nodename从根节点选取/从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置//选取当前节点.选取当前节点的父节点..选取属性@含义路径表达式实例选择school下的所有子节点School选取根元素school,假如路径起始于正斜杠“/”,则此路径始终代表到某元素的绝对路径/school选取所有属于school的子元素的class元素school/class选取所有class子元素,而不管它们在文档中的位置//class选择所有属于school元素的后代的class元素,而不管它们位于school之下的什么位置school//book选取所有名为property的属性//@property

表10.2 XPath中的常用表达式:下表列出相关数据。

表10.2 XPath中的常用表达式
表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性

表10.3 XPath路径表达式实例:下表列出相关数据。

表10.3 XPath路径表达式实例
路径表达式含义
school选择school下的所有子节点
/school选取根元素school,假如路径起始于正斜杠“/”,则此路径始终代表到某元素的绝对路径
school/class选取所有属于school的子元素的class元素
//class选取所有class子元素,而不管它们在文档中的位置
school//book选择所有属于school元素的后代的class元素,而不管它们位于school之下的什么位置
//@property选取所有名为property的属性

第17页:可以使用谓词和通配符表达更

另外,还可以使用谓词和通配符表达更为复杂的路径表达式,如表10.4所示。

表10.4复杂的路径表达式实例:下表列出相关数据。

表10.4复杂的路径表达式实例
路径表达式含义
/school/class[1]选取属于school的第1个class元素
/school/class[last()]选取属于school的最后1个class元素
/school/class[last()-1]选取属于school的倒数第2个class元素
/school/class[position<4]选取属于school的最前面3个class元素
/school/class[student_count>35]选取所有school元素的class元素,且其中student_count元素的值须大于35
//school[@property="20"]选取所有属性property等于20的school元素
/school/*选取school下的所有子节点
//*选取所有元素
//property=[@*]选取所有带有property属性的元素

第18页:2.XML数据类型方法

2.XML数据类型方法SQL Server 2008系统提供了一些内置的用于XML数据类型的方法。由于XML数据是分层次的,具有完整的结构和元数据,所以在查询XML实例时与普通数据类型不同。可以使用XML数据类型方法查询存储在XML类型的变量或列中的XML实例。常用的XML数据类型方法有以下几种。(1)query()方法。

语法格式:query ('XQuery')该方法只有一个参数XQuery,XQuery为一个字符串,用于指定查询XML实例中的XML节点(如元素、属性)的XQuery表达式。query()方法返回一个XML类型的结果

第19页:【例10.4】声明一个

【例10.4】声明一个

声明一个XML变量并将有关学生信息的XML数据分配给它,再使用query()方法对文档指定XQuery来查询<student>子元素。 DECLARE @xmldoc xml SET @xmldoc=' <school><class><student><name>王林</name><sex>男</sex><age>20</age></student><student><name>何丽</name><sex>女</sex><age>21</age></student></class></school>' SELECT @xmldoc.query('/school/class/student') AS学生信息

第20页:query()方法执行结果

执行结果如图10.3所示。图10.3 query()方法的使用及执行结果(2)value()方法。语法格式:value (XQuery, SQLType)value()方法对XML执行XQuery查询,并返回SQL类型的标量值。通常,可以使用此方法从XML类型列、参数或变量内存储的XML实例中提取值。

这样就可以指定将XML数据与非XML列中的数据进行合并或比较的SELECT查询了。XQuery:XQuery表达式,一个字符串文字,从XML实例内部检索数据。XQuery必须最多返回一个值,否则将返回错误。SQLType:要返回的首选SQL数据类型,value()方法的返回类型要与SQLType参数匹配。

第21页:【例10.5】使用value

【例10.5】使用value

使用value()方法从XML数据中查询出元素的属性值,并赋给char变量。 DECLARE @xmldoc xml DECLARE @number char(6) SET @xmldoc=' <school><class><student number="081101"><name>王林</name><sex>男</sex><age>20</age></student><student number="081102"><name>何丽</name><sex>女</sex><age>21</age></student></class></school>' SET @number=@xmldoc.value('(/school/class/student/@number)[1]','char(6)') SELECT @number AS学号

第22页:value()方法执行结果

执行结果如图10.4所示。图10.4 value()方法的使用(3)exist()方法。语法格式:exist (XQuery)exist()方法返回一个“位”值,表示下列条件之一。1,表示True(如果查询中的XQuery表达式返回一个非空结果),即它至少返回一个XML节点。0,表示False(如果它返回一个空结果)。

NULL(如果执行查询的XML数据类型实例包含NULL)。

第23页:【例10.6】使用exist

【例10.6】使用exist

使用exist()方法判断一个XML变量中是否存在某个属性。 DECLARE @xmldoc xml SET @xmldoc= '<student name="王林"></student>' SELECT @xmldoc.exist('/student/@name') AS位值执行结果如图10.5所示。图10.5 exist()方法的使用

第24页:(4)modify

(4)modify()方法。语法格式:modify (XML_DML)使用该方法可以修改XML文档的内容,也可以修改XML类型变量或列的内容等。XML_DML参数是XML数据操作语言(DML)中的字符串,使用XML DML语句可以在XML数据中插入、更新或删除节点。modify()方法只能在UPDATE语句的SET子句中使用。

XML数据修改语言(XML DML)是对XQuery语言的扩展,使XQuery语言能够进行数据操作(DML)。XML DML将下列区分大小写的关键字添加到XQuery中:insert(插入)、delete(删除)、replace value of(替换)。

XML DML中insert关键字的功能是将一个或多个节点作为XML实例中节点的子节点或同级节点插入XML实例中。语法格式如下:insert Expression1 {{as first | as last} into | after | before}Expression2

第25页:【例10.7】使用XML DML语句

【例10.7】使用XML DML语句

使用XML DML语句在一段XML数据中一个节点的后面添加一个节点。 DECLARE @xmldoc xml SET @xmldoc='<student><name>王林</name><sex>男</sex><age>20</age></student>' SELECT @xmldoc AS插入节点前数据SET @xmldoc.modify('insert <birthday>1991-02-10</birthday> after(/student/sex)[1]') SELECT @xmldoc插入节点后数据执行结果如图10.6所示。图10.6插入节点

第26页:XML DML语句

XML DML语句的delete关键字的功能是删除XML实例中的节点。语法格式如下:delete Expression表达式Expression不能是根节点。如果表达式返回空序列,则不进行删除,不返回错误。

【例10.8】删除

删除XML类型变量中的一个节点。 DECLARE @xmldoc xml SET @xmldoc= '<student><name>王林</name><sex>男</sex><age>20</age></student>' SELECT @xmldoc AS删除节点前数据SET @xmldoc.modify('delete (/student/age)[1]') SELECT @xmldoc删除节点后数据执行结果如图10.7所示。图10.7删除节点

第27页:XML DML语句

XML DML语句的replace value of关键字的功能是在XML文档中更新节点的值。语法格式如下:replace value of Expression1 with Expression2Expression1标识其值要更新的节点,它必须仅标识一个单个节点。Expression2用于指定节点的新值。

【例10.9】将学生信息

将学生信息的XML数据中的name节点的属性值“081101”使用“091101”来代替。 DECLARE @xmldoc xml SET @xmldoc= '<student><name number="081101">王林</name><sex>男</sex><age>20</age> </student>' SELECT @xmldoc AS更新节点前数据SET @xmldoc.modify('replace value of (/student/name/@number)[1] with"091101" ') SELECT @xmldoc更新节点后数据

第28页:更新XML节点值的执行结果

执行结果如图10.8所示。图10.8更新节点的值(5)nodes()方法。nodes()方法可以将XML实例拆分成关系数据。nodes()方法的结果是一个包含原始XML实例的逻辑副本的行集。在这些逻辑副本中,每个行示例的上下文节点都被设置成由查询表达式标识的节点之一。这样,后续的查询可以浏览与这些上下文节点相关的节点。

语法格式:nodes (XQuery) as Table(Column)XQuery参数是一个字符串形式的XQuery表达式。如果查询表达式构造节点,这些已构造的节点将在结果行集中显示。Table(Column)用于指定结果行集的表名称和列名称。

第29页:【例10.10】使用nodes

【例10.10】使用nodes

使用nodes()方法查找并列的<student>节点。 DECLARE @xmldoc xml SET @xmldoc='<class><student number="081101"><name>王林</name><sex>男</sex><age>20</age></student><student number="081102"><name>王燕</name><sex>女</sex><age>21</age></student></class>' SELECT T.a.query('.') AS结果FROM @xmldoc.nodes(‘/class/student’) T(a)

第30页:图10.9 nodes

执行结果如图10.9所示。图10.9 nodes()方法的使用

第31页:3.XQuery查询语法

3.XQuery查询SQL Server 2008支持的XQuery基本语法中除了能够使用Xpath路径表达式进行查询外,还包含一个通用标准格式:FLWOR表达式。FLWOR是“For,Let,Where,Order by,Return”的缩写。

以下示例说明了FLWOR的用法(假设book元素是根元素):for $x in doc("note.xml")/book/notelet $y :=/book/note/towhere $x/number<20order by $x/brandreturn $x/brand

第32页:【例10.11】查询

【例10.11】查询

查询xml文档中age元素小于20的name元素的数据。 DECLARE @xmldoc xml SET @xmldoc='<class><student number="081101"><name>王林</name><sex>男</sex><age>20</age></student><student number="081102"><name>王燕</name><sex>女</sex><age>19</age></student><student number="081103"><name>程明</name><sex>男</sex><age>18</age></student></class>' SELECT @xmldoc.query('/class/student[age<20]')执行结果如图10.10所示。图10.10例10.11中查询age元素小于20的XML数据

第33页:【例10.12】使用FLWOR表达式查询

【例10.12】使用FLWOR表达式查询

使用FLWOR表达式查询XML数据。 DECLARE @x XMLSET @x='<ManuInstructions ProductModelID="1"ProductModelName="SomeBike" ><Location LocationID="L1" ><Step>Manu step 1 at Loc 1</Step><Step>Manu step 2 at Loc 1</Step><Step>Manu step 3 at Loc 1</Step></Location><Location LocationID="L2" ><Step>Manu step 1 at Loc 2</Step><Step>Manu step 2 at Loc 2</Step><Step>Manu step 3 at Loc 2</Step></Location></ManuInstructions>' SELECT @x.query( 'for $step in /ManuInstructions/Location[1]/Stepreturn string($step) ' )

第34页:图10.11 FLWOR表达式示例

执行结果如图10.11所示。图10.11例10.12中FLWOR表达式的使用

第35页:FOR XML子句生成XML

在SELECT语句中使用FOR XML子句可以将SQL Server 2008中表的数据检索出来并自动生成XML格式。

语法格式:FOR XML{{ RAW [ ( 'ElementName' ) ] | AUTO }[ <CommonDirectives>[ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ][ , ELEMENTS [ XSINIL | ABSENT ]]| EXPLICIT [ <CommonDirectives> [ , XMLDATA ] ]| PATH [ ( 'ElementName' ) ] [<CommonDirectives> [ , ELEMENTS [ XSINIL |ABSENT ] ] ]}<CommonDirectives> ::=[ , BINARY BASE64 ][ , TYPE ][ , ROOT [ ( 'RootName' ) ]]

第36页:1.FOR XML RAW

1.FOR XML RAWFOR XML RAW是FOR XML查询模式中最简单的一种。它获得查询结果并将结果集内的每一行转换为以一般标识符<row />作为元素标记的XML元素。

在默认情况下,RAW模式下元素名称为<row>,结果集中非空的列值将映射为<row>元素的一个属性,即<row>元素的属性名称为列名或列别名。如果需要定义别的元素名称,则可以使用ElementName来指定。RAW模式下可以使用以下选项。

BINARY BASE64:指定查询返回二进制base64编码格式的二进制数据。TYPE:指定查询以XML类型返回结果。ROOT [('RootName')]:指定将一个根元素添加到结果XML中。可以指定要使用RootName生成的根元素名称,如果不指定则默认为<root>。

XMLDATA:返回内联XDR架构,但不将根元素添加到结果中。后续的SQL Server版本将删除该选项,这里不推荐使用。XMLSCHEMA [('TargetNameSpaceURI')]:返回内联XSD架构。如果指定该选项(用于返回架构中指定的命名空间),则可以选择指定目标命名空间URI。ELEMENTS:指定列作为子元素返回。

其中,ELEMENTS XSINIL指定为空列值创建其xsi:nil属性设置为True的元素。ELEMENTS ABSENT指示对于空列值,将不在XML结果中添加对应的XML元素。

第37页:【例10.13】查询PXSCJ数据库

【例10.13】查询PXSCJ数据库

查询PXSCJ数据库的XSB表中总学分大于50的学生信息,并将结果返回为XML元素。 USE PXSCJ GO SELECT学号,姓名,性别,出生时间FROM XSBWHERE总学分>50 FOR XML RAW执行上述语句,查看结果窗口中的结果,如图10.12所示。图10.12使用RAW模式将查询结果生成为XML元素

第38页:【例10.14】RAW模式示例

【例10.14】使用

使用RAW模式指定以XML类型返回结果。 DECLARE @x XMLSET @x=(SELECT *FROM KCBFOR XML RAW('course'),TYPE) SELECT @x执行结果如图10.13所示。图10.13返回XML类型的结果

第39页:2.FOR XML AUTO

2.FOR XML AUTOFOR XML AUTO模式也返回XML文档,该模式将查询结果返回为嵌套的XML树形式。不过和RAW模式不同的是,在AUTO模式中使用表名作为元素名称,FROM子句中每个在SELECT子句中至少列出一次的表都被表示为一个XML元素,使用列名作为属性名称。AUTO模式中使用的选项命令与RAW模式的相同。

【例10.15】使用AUTO模式检索出学生

使用AUTO模式检索出学生的学号、课程名和成绩信息。 SELECT CJB.学号,课程名,成绩FROM CJB JOIN KCBON CJB.课程号=KCB.课程号FOR XML AUTO

第40页:图10.14 使用AUTO模式生成

执行结果如图10.14所示。图10.14使用AUTO模式生成XML元素

第41页:3.FOR XML EXPLICIT

3.FOR XML EXPLICIT使用RAW和AUTO模式都不能很好地控制从查询结果生成的XML的形状,而FORXML EXPLICIT模式允许用户显式地定义结果XML树的形状。EXPLICIT模式产生独立于表的具有任意树形的层次结构。如果直接在SELECT语句中使用FOR XML EXPLICIT子句,会出现错误。

要正确使用FOR XML EXPLICIT模式,在SELECT关键字后必须增加两个数据列:Tag和Parent。第一列名称为Tag,Tag列必须提供当前元素的标记号(整数类型),查询必须为从行集构造的每个元素提供唯一标记号。第二列名称为Parent,Parent列必须提供父元素的标记号,如果父元素为根元素,则可以使用NULL或0。

这样,Tag和Parent列将提供层次结构信息。例如,Tag列的值为1,Parent列的值为NULL,则相应的元素将作为根元素。Tag值为2,Parent值为1,则标记号为2的数据列的一组元素将作为根元素的子元素添加。除了在SELECT子句后包含Tag和Parent列外,还应该至少包含一个数据列。

格式如下:[ ElementName!TagNumber!AttributeName!Directive ]

第42页:【例10.16】EXPLICIT模式

【例10.16】使用EXPLICIT模式检索出学号

使用EXPLICIT模式检索出学号、姓名、总学分3列的信息。 SELECT DISTINCT 1 AS Tag, NULL AS Parent,XSB.学号AS [学生信息!1!学号],姓名AS [学生信息!1!姓名],NULL AS [成绩信息!2!成绩] FROM XSB, CJBWHERE XSB.学号=CJB.学号UNION ALLSELECT 2 AS Tag, 1 AS Parent,XSB.学号,姓名,成绩FROM XSB, CJBWHERE XSB.学号=CJB.学号ORDER BY [学生信息!1!学号],[成绩信息!2!成绩] FOR XML EXPLICIT

第43页:UNION ALL组合父子元素

上述语句中使用UNION ALL组合了两个查询,第一个查询将<学生信息>设为父元素,并设置属性“学号”和“姓名”,将值2赋给<成绩信息>元素的Tag,将值1赋给Parent,从而将<成绩信息>设为<学生信息>的子元素。应用FOR XML EXPLICIT,并指定所需的ORDER BY子句。

必须先按学号、再按成绩对行集进行排序,以便先显示成绩中的NULL值。执行上述语句后单击显示的结果,显示如图10.15所示的窗口。图10.15使用EXPLICIT模式生成XML元素

第44页:4.FOR XML PATH

4.FOR XML PATHFOR XML PATH模式提供了一种更简单的方法来混合元素和属性。PATH模式还是一种用于引入附加嵌套来表示复杂属性的较简单的方法。使用PATH模式可以为使用EXPLICIT指令所编写的查询提供更简单的代替方案。

语法格式:FOR XML PATH [ ( 'ElementName' ) ] [<CommonDirectives> [ , ELEMENTS [ XSINIL |ABSENT ] ] ]在PATH模式中,列名或列别名被作为XPath表达式来处理。这些表达式指明了如何将值映射到XML。

每个XPath表达式都是一个相对XPath,它提供了项类型(如属性、元素和标量值)以及将相对于行元素而生成的节点的名称和层次结构。如果查询生成的结果集中包含了列名,则指定的列名将作为<row>元素的子元素,相应的列值将作为元素的内容。

例如,SELECT *FROM XSBWHERE学号= '081101'FOR XML PATH

第45页:RAW模式的执行结果

上述语句的执行结果如下:<row><学号>081101</学号><姓名>王林</姓名><性别>1</性别><出生时间>1990-02-10</出生时间><专业>计算机</专业><总学分>60</总学分></row>如果指定的列别名以“@”符号开始并且不包含“/”标记,则将创建包含相应列值的<row>元素的属性。

例如,SELECT学号AS '@编号',姓名,出生时间,总学分FROM XSBWHERE学号= '081101'FOR XML PATH

第46页:PATH模式的执行结果

上述语句的执行结果如下:<row编号="081101"><姓名>王林</姓名><出生时间>1990-02-10</出生时间><总学分>60</总学分></row>使用“/”标记可以指定元素的层次,例如,“学生信息/学号”可以指定<学生信息>为父元素,<学号>为子元素。

【例10.17】查找总学分大

查找总学分大于50的学生,<row>元素更名为<学生管理>,“备注”作为“学生管理”的属性。“学生管理”元素下是“学生信息”元素,“学号”、“姓名”和“总学分”作为“学生信息”的子元素。SELECT备注AS '@备注',学号AS '学生信息/学号',姓名AS '学生信息/姓名',总学分AS '学生信息/总学分' FROM XSBWHERE总学分>50 FOR XML PATH('学生管理')

第47页:图10.16 使用PATH模式生成

执行结果如图10.16所示。图10.16使用PATH模式生成XML元素

顶部目录