第二十八讲 SQLServer的内置XML支持
* 摘要
。SQLServer同内置XML支持
。FOR XML
。OPEN XML
。SQLXML的使用
* SQL Server2000中的XML支持
。服务器支持:
在服务器上,XML数据可以从表生成,并通过在SELECT语句中使用FOR XML子句来查询结果。FOR XML的逆函数是一个名为OPENXML的关系行集合生成器函数:它通过求XPath1.0表达式的值来从XML数据提取值,并将其放到行集合的列中。
。客户端支持:
SQL Server2000对客户端编程的支持称SQLXML。这项技术的核心是XML视图,它是XML架构和关系表之间的双向映射。XML视图允许使用XPath1.0的一个子集来进行查询,其中,可以使用映射将路径表达式转换成底层表中的SQL查询,并且将查询结果打包成XML结果。
* FOR XML
。SQL Server和XML之间的集成首要一点就是根据SQL数据创建XML文件。XML文件构造并不复杂,用简单的脚本和ADO记录集就可以轻松产生。这个任务虽然不算麻烦,但开发人却需要针对他们从服务器获取的结果集合产生不同的脚本,或者编写更为复杂通通用脚本。SELECT语句则由此而配备了新的FOR XML子句。
。FOR XML-SQL SELECT 语句的FOR XML子句。该语句允许一个行集作为XML文档返回。
。每个FORXML查询的结果都返回包含单行单列的行集,存储在该单行/列中的值是XML文档。在查询器中其列名为一个GUID前加一个前缀“XML_”组成。
。由FOR XML子句产生的XML文档,在所产生的文档层次,每列转换的数据、二进制数据表示,所产生的XML schema以及和其和XML的细小
差别等方面,可以高度自定义。
* FOR XML语法
。该子句的语法如下所示:
[FOR {XML{RAW|AUTO|EXPLICIT}
[,XMLDATA]
[,ELEMENTS]
[,BINARY BASE64]}]
* FOR XML 模式
FORXML从最简单到最复杂共有RAW,AUTO和EXPLICIT三种模式。这三种模式产生的SQL如下:
。RAW-产生一个两维的XML网格,其中,行值(查询返回的)部包含在称为行(row)的元素里。查询所返回的每一个列值都由一个有一
对行标记属性表示
。AUTO-产生一个潜在的层次化XML文档,该文档中每一个列值(由查询返回)都包含在一个元素或属性中
。EXPLICIT-在这种模式下我们可以指定用于包含由FOR XML EXPLICIT查询返回的列值的精确表单。列值可以作为属性或元素返回。该特
征可基于各列指定。表示每一列的数据类型是可以具体指定的,正如我们可以指定为由查询产生的精确XML层次文档。
* FOR XML EXPLICIT
。FOR EXPLICIT查询是FORXML查询中最复杂,最个性化的一种。使用该查询可以为每个“表例”结指定XML数据层次结构中的具体位置。
。FOR XML EXPLICIT查询利用per-column指令控制所产生数据的格式。该指令指定“表/列”对是否表示为XML元素或属性。这就意味着:
数据表中的某列可能产生一个XML元素,而另一列则可能产生一属性。
* FOR XML EXPLICIT
。下面的FOR XML EXPLICIT查询SELECT语句掩饰了Northwind的Region数据表的RegionID列是怎样在同一个XML文档中既被 指定为属性又
被指定为元素的:
SELECT 1 AS Tag,
0 AS Parent,
RegionID AS [Region!1!RegionIDAsAttrbute],
RegionID AS
[Region!1!RegionIDAsElement!element]
FROM Region
FOR XML EXPLICIT
* 三种模式优缺点
。指定RAW模式时,查询结果集中每一个记录包含唯一的元素<row>。由于我们无法控制元素名字和文档结构,因此这种模式不是很有用。
。指定AUTO模式时,虽然可以得到层次结构,但这种层次结构是线性的,即每个父节点只能有一个子节点,反之亦然;通过别名指定元素
名字不太方便,而且有时候会影响查询命令本身的可读性:无法在文档中同时生成元素和属性。要么全部是元素(通过ELEMENTS关键词指
定),要么全部是属性(默认)。
。EXPLICIT模式比较复杂,我们将用另外一种方法来表达图1所显示的查询。这种方法使得我们能够完全地控制查询所生成的XML文档。
* FOR XML EXPLICIT语法
columnName
AS[ContainedElementName!Tag!AttributeOrElementName!Directive]
。ContainedElementName:包含一个列的元素名称
。Tag:和各列相关的标签值
。AttributeOrElementName:含有列数据的元素或者属性的名字
。Directive:用来指定数据应采取的格式(hide,element,xml,xmltext,CDATA)
* FOR XML EXPLICIT示例
。-商店数据
SELECT 1 as Tag,
NULL as Parent,
s.stor_id as [store!1!id],
s.stor_name as [store!1!Name],
NULL as [sale!2!OrderNo],
NULL as [sale!2!Qty]
FORM stores s
UNION ALL
-销售数据
SELECT 2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROM stores s,sales sa
WHERE s.stor_id=sa.stor_id
ORDER BY [store!1!name]
FOR XML EXPLICIT
* FOR XML参数
。ELEMENTS-只能应用于FOR XML AUTO查询,它指示为每列所返回的列值以XML文档中以一个元素表示,而不是作为一个属性(默认)。
。BINARY BASE64-该选项使XML文档中的二进制数据被表示为BINARY BASE64编码。这种二进制数据一般都存在于BINARY,VARBINARY或IMAGE类型的列中。
。XMLDATA:该选项为FORXML查询产生的XML文档产生一个XML数据模式。该模式是XML文档的预定义格式。
* OPEN XML
。OPENXML函数可以让你像操作一个表那样来运用XML数据,可以将它们转换成内存中的一个rowset.
。打开这个行集后可以各种SQL语句进行操作。
* OPEN XML 语法
。OPENXML(idoc int[in],rowpattern navarchar[in],[flags byte[in]])[WITH(SechemaDEclaration|TableName)]
。Idoc:int类型的输入参数,引用XML文档句柄,是利用sp_xml_preparedocument创建的
。Rowpattern:navarchar类型的输入参数,XPATH模式,指定将XML文档的节点处理成行集。
例如:N'/TOP/Region表明Region节点为要解释的XML文档的级别。
。Flags:byte类型的输入参数,指示了如何将XML节点的类型解释该生集的列。0和1表明使用属性表示列,2表明使用元素表示列等。
* With子句
。WITH SchemaDeclaration:允许指定个模式
。WITH TableName:将与特定数据表相关的模式应用于所指定的XML文档。常用选项
* OPENXML使用步骤
。首先要调用sp_xml_preparedocument存储过程,为其传递一个XML文档作为输入参数。该存储过程返回一个用于XML文档内部显示的句柄
。调用OPENXML以分割XML文档,并创建一个行集。执行各种操作。
。在处理完XML数据后,我们可以调用sp_xml_removedocument将XML数据从内存中删除。
* SQLXML
XML for SQL Server,又名SQLXML,可帮助开发人员在扩展标记语言(XML)和相关数据之间架设起沟通的桥梁。由于发布SQL Server2000时还没有Web Services,另外SQL Server 2000中内建的对XML的支持并非都遵循最新的W3C标准,所以SQLXML更象是一个补丁。
* 访问SQLXML
在SQL Server2000中,有两种访问SQlXML功能的主要方法:
。HTTP访问:
SQL Server 2000中的SQLXML功能也可以使用SQLXML ISAPI过滤器通过HTTP进行访问不。通过使用我们配置工具,您可以建立网站来检索传入请求,从页通过HTTP执行XML模板,XML视图之让的FOR XML和XPath1.0语句。
。SQLXMLOLEDB Provider:SQLXMLOLEDB Provider是一个OLE DB提供程序,它通过ADO公开Microsoft SQLXML功能。
* 使用HTTP访问
SQL Server的多种方式
。首先要使用IIS Virtual Directory Management 建立Virtual Directory和Virtual Name并且进行配置。
。访问举例:
http://localhost/Northwind?sql=select+*+FROM+Employees+FOR+XML+AUTO&root=root
* 使用SQLXML Managed Classes
。SqlXml数据提供程序没有实现Connection类,只实现了Command,Parameter以及Adapter类
。SqlXml在Command对象上揭示了所有功能,从而允许使用流式输入,使用XPath查询,为XPath指定XML映射架构,添加XML根元素以及通过XSL样式进行后期处理。所有这些功能在其属性中得以设置。