图像和XML数据的.ppt
第8章 图像和XML数据的添加应用实践,导入读者照片,导入读者联系方式,查询读者联系方式,导入读者照片,导入读者联系方式,查询读者联系方式,8.1 导入读者照片,实现功能:借书证号为081101的读者的照片保存在D盘根目录下,照片的名称为081101.jpg,现要在SQL Server服务器上将该照片信息导入到图书管理数据库MBOOK中该读者的照片列上。实现方法:新建一个查询窗口,在窗口中输入如下语句:USE MBOOKGOUPDATE TReader SET 照片=(SELECT*FROM OPENROWSET(BULK ND:081101.jpg,SINGLE_BLOB)AS image)WHERE 借书证号=081101执行成功后查询081101读者的照片信息:SELECT 借书证号,照片 FROM TReaderWHRER 借书证号=081101执行结果如下所示:,8.1 导入读者照片,说明:OPENROWSET行集函数用于大容量数据的导入导出,修改照片信息时该函数用于加载已经存在的081101.jpg文件,并返回一个表。使用SELECT语句得到返回的表的内容,语句中为该表定义了别名image。使用UPDATE语句可以直接将得到的内容赋给TReader表的照片列,以二进制格式存储。除了可以加载图片文件,OPENROWSET函数还可以加载XML文件。,8.2 导入读者联系方式,实现功能:如表8.1所示提供了081101、081102和081103借书证号读者的联系方式,要求将联系方式导入到MBOOK数据库的读者信息表中。方法一:使用UPDATE语句将081101读者的联系方式直接修改为表8.1所示的联系方式,使用的SQL语句如下:USE MBOOKGOUPDATE TReader SET 联系方式=WL211101江苏省南京市鼓楼区上海路3号WHERE 借书证号=081101,8.2 导入读者联系方式,执行后使用SELECT语句查询081101的联系方式:SELECT 借书证号,联系方式 FROM TReaderWHERE 借书证号=081101执行结果如下所示:,说明:读者的联系方式是以XML格式的形式存放的,根据XML语法可知,读者081101的为根元素,根元素下包含了读者的、和信息。要存放XML数据,存放数据的列或变量必须为xml数据类型。,8.2 导入读者联系方式,方法二:将081102读者的联系方式存储在081102.xml文件中,并将该文件导入到MBOOK数据库该读者的联系方式中。在D盘根目录下新建一个文本文档,输入以下代码:CM211100江苏省镇江市京口区学府路28号,8.2 导入读者联系方式,将文件名保存为081102.xml,打开“SQL Server Management Studio”,新建一个查询窗口,输入如下语句:USE MBOOKGOUPDATE TReader SET 联系方式=(SELECT*FROM OPENROWSET(BULK ND:081102.xml,SINGLE_BLOB)AS temp_table)WHERE 借书证号=081102执行后使用SELECT语句查询081102的联系方式:SELECT 借书证号,联系方式 FROM TReaderWHERE 借书证号=081102执行结果如下所示:,8.3 查询读者联系方式,(1)查询081101读者的详细地址。实现方法:新建一个查询窗口,输入如下语句:USE MBOOKGODECLARE contact xmlSELECT contact=联系方式 FROM TReader WHERE 借书证号=081101SELECT contact.query(/联系方式/地址/详细地址)AS 详细地址执行结果如下所示:,说明:以上语句中将读者081101的联系方式列上的内容赋给xml变量contact,再通过XQuery语法中的XML数据类型方法query()方法查询xml变量contact中“详细地址”节点的内容。query()方法中的参数指定到“详细地址”节点。,返回,8.3 查询读者联系方式,(2)查询081102读者“联系方式”中的姓名。实现方法:新建一个查询窗口,输入如下语句:DECLARE contact xml,name char(8)SELECT contact=联系方式 FROM TReader WHERE 借书证号=081102SET name=contact.value(/联系方式/姓名)1,char(8)SELECT name 姓名执行结果如下所示:,L8.1 导入读者照片,L1OPENROWSET行集函数当数据是以大容量的文件格式存在时,直接插入的方式显然不太合适。这时可以使用行集函数OPENROWSET来完成。OPENROWSET函数返回一个表,可以在查询的FROM子句中像引用表名那样引用OPENROWSET函数。将OPENROWSET函数返回的内容用做INSERT或其他语句的源表,就可以将数据文件中的数据导入到SQL Server表中。OPENROWSET函数的语法格式如下:OPENROWSET(BULK data_file,SINGLE_BLOB|SINGLE_CLOB|SINGLE_NCLOB),L1OPENROWSET行集函数,说明:(1)BULK:使用OPENROWSET的BULK行集访问接口读取文件中的数据。在SQL Server中,OPENROWSET无须将数据文件中的数据加载到目标表,便可读取这些数据。这样便可在单个SELECT语句中使用OPENROWSET。(2)data_file:数据文件的完整路径,该文件的数据将被复制到目标表中。(3)SINGLE_BLOB|SINGLE_CLOB|SINGLE_NCLOB:SINGLE_BLO表示将data_file的内容作为类型为varbinary(MAX)的单行单列行集返回;SINGLE_CLOB表示通过以ASC格式读取data_file,使用当前数据库的排序规则将内容作为类型为varchar(MAX)的单行单列行集返回;SINGLE_NCLOB表示通过以UNICODE格式读取data_file,使用当前数据库的排序规则将内容作为类型为nvarchar(MAX)的单行单列行集返回。,L1OPENROWSET行集函数,(4)与SELECT一起使用的FROM子句可以调用OPENROWSET(BULK.)而非表名,同时可以实现完整的SELECT功能。带有BULK选项的OPENROWSET函数在FROM子句中时,需要使用AS子句指定一个别名。也可以指定列别名,如果未指定列别名列表,则格式化文件必须具有列名,指定列别名会覆盖格式化文件中的列名,例如:SELECT FROM OPENROWSET(BULK.)AS table_alias SELECT FROM OPENROWSET(BULK.)AS table_alias(column_alias,.n),L1OPENROWSET行集函数,【强化练习】假设081102.jpg文件保存在D盘根目录下,在PXSCJ数据库中新建一个Imagetable表,包含Name和Content两列,分别存储图片文件名和图片文件的内容。使用OPENROWSET函数将081102.jpg文件导入数据表Imagetable中。创建Imagetable表的语句如下:USE PXSCJGOCREATE TABLE Imagetable(Namechar(20)NOT NULL PRIMARY KEY,Contentvarbinary(MAX)NULL,)插入数据使用如下语句:INSERT INTO Imagetable(name,content)SELECT 081102.jpg AS name,*FROM OPENROWSET(BULK ND:081102.jpg,SINGLE_BLOB)AS note,L1OPENROWSET行集函数,图片插入后可以使用SELECT语句查看插入了的数据:SELECT*FROM Imagetable执行结果如下所示:,返回,L8.2 导入读者联系方式,L1XMLXML(eXtensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。XML是Internet环境中跨平台的、依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单,易于掌握和使用。XML是一种标准化的文档格式语言,它使得发布者可以创建一个以不同方式查看、显示或打印的文档资源。XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身;而HTML是用来定义数据的,重在数据的显示模式。另外,XML是可扩展的,因为它提供了一个标准机制,使得任意文档构造者都能在任意XML文档中定义新的XML标记,这使得综合的、多平台的、应用到应用的协议的创建降低了门槛。,返回,L1XML,XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其他的数据交换格式,但不久之后它们都将支持XML,那就意味着程序可以更容易地与Windows、Mac OS、Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中进行分析,并以XML格式输出结果。XML文档是由DTD和XML文本组成。所谓DTD(Document Type Definition),简单的说是一组关于标记符的语法规则,表明XML文本是如何组织的。它是保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来确定文档是否符合规范,元素和标签使用是否正确。,L2XML语法,本小节将从一个简单的XML实例开始介绍XML的语法,实例代码如下:wangzhangReminderDont forget me this weekend!12,L2XML语法,XML文档中的元素还可以带有若干个属性,属性的名称也是由用户自己定义的,属性的值必须添加引号。格式如下:元素内容文件中的“age=20”即为元素的属性和值。在编写XML文本时需要注意以下几点。XML标签的名称可以包含字母、数字及其他字符,不能以数字或标点符号开始;不能以字符“xml”、“XML”或“Xml”等开始;不能包含空格。XML语法是区分大小写的,所以在定义XML标签时必须保持大小写的一致性,例如,打开开始标签为“”,结束标签为“”就是错误的写法。XML必须正确地嵌套,例如,以下的标签嵌套关系是错误的:This text is bold and italic必须修改为:This text is bold and italic,L2XML语法,XML文档中允许空元素的存在,所谓的空元素就是只有标签没有实际内容的元素,空元素有两种表示方法。例如:“”或“”。在XML文档中所有的空格都会被保留。可以在XML文档中写注释,注释形式与HTML中一样,例如:XML中的实体引用。在XML文档中有一些字符具有特殊意义,例如:如果把字符“”放在XML元素中,会出错,因为解析器会把它当做新元素的开始。为了避免错误,需要用其对应的实体引用表示。XML中有5个预定义的实体引用,如表8.2所示。,表8.2 XML中的实体引用,返回,L8.3 查询读者联系方式,L1XQuery语法1XPath语法XPath是一种在XML文档中查找信息的语言,使用XPath的标准路径表达式可以在XML文档中选取相应的XML节点。在XPath中有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释和文档(根)节点。例如:在之前创建的note.xml文件中,“”是根节点,“wang”是元素节点,“age=20”是属性节点。XPath是根据路径表达式在XML文档中查找信息的,其路径表达式与Windows的文件路径类似。可以把XPath比做文件管理路径,通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点。XPath中常用的基本表达式在表8.3中列出。,表8.3 XPath中的常用表达式,L1XQuery语法,表8.4中给出了一些XPath中路径表达式的实例。,表8.4 XPath路径表达式实例,L1XQuery语法,另外,还可以使用谓词和通配符表达更为复杂的路径表达式,如表8.5所示。,表8.5 复杂的路径表达式实例,L1XQuery语法,2XML数据类型方法SQL Server提供了一些内置的用于XML数据类型的方法。由于XML数据是分层次的,具有完整的结构和元数据,所以在查询XML实例时与普通数据类型不同,可以使用XML数据类型方法查询存储在xml类型的变量或列中的XML实例。常用的XML数据类型方法有以下几种。(1)query()方法。语法格式:query(XQuery)该方法只有一个参数XQuery,XQuery为一个字符串,用于指定查询XML实例中的XML节点(如元素、属性)的XQuery表达式。query()方法返回一个XML类型的结果。,L1XQuery语法,【强化练习】声明一个xml变量并将有关学生信息的XML数据分配给它,再使用query()方法对文档指定XQuery来查询子元素。DECLARE xmldoc xmlSET xmldoc=王林男20何丽女21SELECT xmldoc.query(/school/class/student)AS 学生信息执行结果如下所示:,L1XQuery语法,(2)value()方法。语法格式:value(XQuery,SQLType)value()方法对XML执行XQuery查询,并返回SQL类型的标量值。通常,可以使用此方法从XML类型列、参数或变量内存储的XML实例中提取值。这样就可以指定将XML数据与非XML列中的数据进行合并或比较的SELECT查询。XQuery:XQuery表达式为一个字符串文字,从XML实例内部检索数据。XQuery必须最多返回一个值,否则将返回错误。SQLType:要返回的首选SQL数据类型,value()方法的返回类型要与SQLType参数匹配。vaule()方法返回一个带有结果的非XML数据类型,且只能返回单个值。(3)exist()方法。语法格式:exist(XQuery)exist()方法返回一个“位”值,表示下列条件之一:表示True(如果查询中的XQuery表达式返回一个非空结果),即它至少返回一个XML节点;0,表示False(如果它返回一个空结果);NULL(如果执行查询的XML数据类型实例包含NULL)。,L1XQuery语法,(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|beforeExpression2,L1XQuery语法,说明:Expression1:标识要插入的一个或多个节点。Expression2:标识XML实例中的节点。Expression1标识的节点是相对于Expression2标识的节点插入的。Expression2可以是XQuery表达式,返回当前被引用的文档中现有节点的引用。如果返回多个节点,则插入失败。如果Expression2返回一个空序列,则不会发生插入操作,并且不会返回任何错误。into|after|before:into关键字表示Expression1标识的节点作为Expression2标识的节点的子节点插入。如果Expression2中的节点已有一个或多个子节点,则必须使用as first或as last来指定所需的新节点的添加位置,分别在子列表的开头或末尾。插入属性时忽略as first和as last关键字。after表示Expression1标识的节点作为Expression2标识的节点的同级节点直接插入在其后面。而before则表示Expression1标识的节点作为Expression2标识的节点的同级节点直接插入在其前面。,L1XQuery语法,XML DML语句的delete关键字的功能是删除XML实例中的节点。语法格式如下:delete Expression表达式Expression不能是根节点。如果表达式返回空序列,则不进行删除,不返回错误。XML DML语句的replace value of关键字的功能是在XML文档中更新节点的值。语法格式如下:replace value of Expression1 with Expression2Expression1标识其值要更新的节点,它必须仅标识一个单个节点。Expression2用于指定节点的新值。【强化练习】使用XML DML语句在一段XML数据中一个节点的后面添加一个节点。DECLARE xmldoc xmlSET xmldoc=王林男20SELECT xmldoc AS 插入节点前数据SET xmldoc.modify(insert 1991-02-10 after(/student/sex)1)SELECT xmldoc 插入节点后数据,L1XQuery语法,执行结果如下所示:,L1XQuery语法,(5)nodes()方法。nodes()方法可以将XML实例拆分成关系数据。nodes()方法的结果是一个包含原始XML实例的逻辑副本的行集。在这些逻辑副本中,每个行示例的上下文节点都被设置成由查询表达式标识的节点之一。这样,后续的查询可以浏览与这些上下文节点相关的节点。语法格式:nodes(XQuery)as Table(Column)XQuery参数是一个字符串形式的XQuery表达式。如果查询表达式构造节点,这些已构造的节点将在结果行集中显示。Table(Column)用于指定结果行集的表名称和列名称。,L1XQuery语法,【强化练习】使用nodes()方法查找并列的节点。DECLARE xmldoc xmlSET xmldoc=王林男20王燕女21SELECT T.a.query(.)AS 结果FROM xmldoc.nodes(/class/student)T(a)执行结果如下所示:,L1XQuery语法,3XQuery查询SQL Server支持的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/number20order by$x/brandreturn$x/brand说明:FLWOR表达式可以由以下几部分组成。for语句:将note.xml文件中book元素下所有的note元素提取出来赋给变量$x。其中,doc()是内置函数,作用是打开相应的xml文档。let语句:该语句可选,用于在XQuery表达式中为变量赋值。where语句:该语句可选,用于选取note元素下number元素小于20的note元素。order by语句:该语句可选,用于指定查询结果按照brand升序排序。return语句:return语句中的表达式用于构造FLWOR表达式的结果。,L1XQuery语法,【强化练习】(1)查询xml文档中age元素小于20的name元素的数据。DECLARE xmldoc xmlSET xmldoc=王林男20王燕女19程明男18SELECT xmldoc.query(/class/studentage20)执行结果如下所示:,L1XQuery语法,(2)使用FLWOR表达式查询XML数据。DECLARE x XMLSET x=Manu step 1 at Loc 1 Manu step 2 at Loc 1 Manu step 3 at Loc 1 Manu step 1 at Loc 2 Manu step 2 at Loc 2 Manu step 3 at Loc 2SELECT x.query(for$step in/ManuInstructions/Location1 return string($step)执行结果如下所示:,