SQL Server 2000数据库FOR XML查询概述
|
源代码网整理以下由于XML本身的诸多优点,XML技术已被广泛的使用,目前的好多软件技术同XML紧密相关,比如微软的.net 平台对xml提供了强大的支持,提供System.Xml以及其子命名空间下的类型来操作xml。Ado.net通过核心类型DataSet出色的把关系型数据库同xml进行了紧密集成。由于平常许多开发人员使用.net 来操作SQL Server的到数据集后再转换成xml,所以往往忽略Transact-SQL查询生成XML数据的强大功能。对于一些项目使用XML查询直接通过SQL生成xml会来的更为简便,所以我通过在实际项目中的使用和查阅一些资料写成一个知识点,一是温故而知新,二是对于一些开发者刚好需要这方面的技术而还没有找到比较快捷的学习方式提供一条途径。 源代码网整理以下在SQL SERVER 2000中查询生成XML的语法表达式比较简洁,整个语法如下: 源代码网整理以下SELECT 源代码网整理以下FROM 源代码网整理以下WHERE 源代码网整理以下FOR XML AUTO | RAW | EXPLICIT [,XMLDATA ] [,ELEMENTS] [,BINARY BASE64] 源代码网整理以下下面我将以Northwind数据库来演示上面的表达式中所包含的各项功能,下面的查询语句和返回结果都通过SQL SERVER 2000查询分析器来执行和得到。 源代码网整理以下一.使用AUTO模式 源代码网整理以下该模式我认为在生成单表xml数据方面是用得最多的,能满足一般的需要。先来看他的简单查询。 源代码网整理以下1.简单查询 源代码网整理以下查询语句: 源代码网整理以下SELECT CategoryID, 源代码网整理以下CategoryName 源代码网整理以下FROM Categories 源代码网整理以下WHERE CategoryID < 3 FOR XML AUTO 源代码网整理以下返回结果: 源代码网整理以下 源代码网整理以下查询语句: 源代码网整理以下SELECT CategoryID AS ID, 源代码网整理以下CategoryName, 源代码网整理以下GetDate() as CurrDate 源代码网整理以下FROM Categories MyTable 源代码网整理以下WHERE CategoryID < 3 FOR XML AUTO 源代码网整理以下返回结果: 源代码网整理以下 源代码网整理以下以两个表为例, 源代码网整理以下查询语句: 源代码网整理以下SELECT Categories.CategoryID, 源代码网整理以下Categories.CategoryName, 源代码网整理以下ProductID, 源代码网整理以下ProductName 源代码网整理以下FROM Categories 源代码网整理以下JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <5 源代码网整理以下WHERE Categories.CategoryID < 3 FOR XML AUTO 源代码网整理以下返回结果: 源代码网整理以下可以看到表连接查询可以生成分层次的Xml,不过需要注意的是SELECT子句中的父表的列要排在子表的列的前面,否则会出现你不想看到的结果,如: 源代码网整理以下查询语句: 源代码网整理以下SELECT ProductID,Categories.CategoryID,Categories.CategoryName,ProductName 源代码网整理以下FROM Categories 源代码网整理以下JOIN Products ON Categories.CategoryID = Products.CategoryID and ProductID <5 源代码网整理以下WHERE Categories.CategoryID <3 FOR XML AUTO 源代码网整理以下返回结果: 源代码网整理以下3.使用ELEMENTS选项 源代码网整理以下使用该选项可以生成以元素为中心的Xml表示,默认为属性方式,不过属性方式节省空间。需要注意的是使用ELEMENTS选项是一种全是或全否的形式,不能得到一部分是以元素表示而另一部分以属性表示的Xml数据。 源代码网整理以下查询语句: 源代码网整理以下SELECT CategoryID, 源代码网整理以下CategoryName 源代码网整理以下FROM Categories 源代码网整理以下WHERE CategoryID < 3 源代码网整理以下FOR XML AUTO, ELEMENTS 源代码网整理以下返回结果: 源代码网整理以下1 源代码网整理以下Beverages 源代码网整理以下2 源代码网整理以下Condiments 源代码网整理以下在连接查询时, 源代码网整理以下查询语句: 源代码网整理以下SELECT Categories.CategoryID, 源代码网整理以下ProductID, 源代码网整理以下ProductName 源代码网整理以下FROM Categories 源代码网整理以下JOIN Products ON Categories.CategoryID = Products.CategoryID and ProductID <4 源代码网整理以下WHERE Categories.CategoryID <3 FOR XML AUTO, ELEMENTS 源代码网整理以下返回结果: 源代码网整理以下1 源代码网整理以下1 源代码网整理以下Chai 源代码网整理以下2 源代码网整理以下Chang 源代码网整理以下2 源代码网整理以下3 源代码网整理以下Aniseed Syrup 源代码网整理以下4.检索对二进制数据的XPath引用 源代码网整理以下这是对二进制数据的操作, 源代码网整理以下查询语句: 源代码网整理以下SELECT CategoryID, 源代码网整理以下Picture 源代码网整理以下FROM Categories 源代码网整理以下WHERE CategoryID = 1 源代码网整理以下FOR XML AUTO 源代码网整理以下返回结果: 源代码网整理以下 源代码网整理以下查询语句: 源代码网整理以下SELECT CategoryID, 源代码网整理以下Picture 源代码网整理以下FROM Categories 源代码网整理以下WHERE CategoryID = 1 源代码网整理以下FOR XML AUTO,ELEMENTS 源代码网整理以下返回结果: 源代码网整理以下1 源代码网整理以下dbobject/Categories[@CategoryID="1"]/@Picture 源代码网整理以下二.使用RAW模式 源代码网整理以下使用RAW模式不能使用ELEMENTS选项。 源代码网整理以下1.简单查询 源代码网整理以下查询语句: 源代码网整理以下SELECT CategoryID, 源代码网整理以下CategoryName AS Nanme 源代码网整理以下FROM Categories 源代码网整理以下WHERE CategoryID < 3 源代码网整理以下ORDER BY CategoryID DESC 源代码网整理以下FOR XML RAW 源代码网整理以下返回结果: 源代码网整理以下2.连接查询 源代码网整理以下查询语句: 源代码网整理以下SELECT Categories.CategoryID, 源代码网整理以下Categories.CategoryName, 源代码网整理以下ProductID, 源代码网整理以下ProductName 源代码网整理以下FROM Categories 源代码网整理以下JOIN Products ON Categories.CategoryID = Products.CategoryID and ProductID <4 源代码网整理以下WHERE Categories.CategoryID <= 2 FOR XML RAW 源代码网整理以下返回结果: 源代码网整理以下三.使用EXPLICIT模式 源代码网整理以下该模式使用起来相对比较复杂,不过它可以很灵活的控制返回的xml数据结构。在该查询中定义了两个表示元数据的额外列。Tag列唯一的确定用来在结果中表示每一行的xml标记,Parent列用来控制元素之间的嵌套关系。 源代码网整理以下1.使用通用表 源代码网整理以下EXPLICIT模式下有一个通用表的概念,使用数据列的名称来定义xml文档中的数据。结构如下: 源代码网整理以下ElementName!TagNumber!AttributeName!Directive 源代码网整理以下下面的说明来自联机丛书, 源代码网整理以下ElementName 源代码网整理以下是所得到的元素类属标识符(例如,如果将 Customers 指定为ElementName,则 是元素标记)。 源代码网整理以下TagNumber 源代码网整理以下是元素的标记号。借助于通用表中的两个元数据列(Tag 和 Parent),TagNumber用于表示 XML 树中的 XML 元素嵌套。每个TagNumber都准确对应于一个ElementName。 源代码网整理以下AttributeName 源代码网整理以下是 XML 特性的名称(如果没有指定Directive)或包含的元素名(如果Directive是 xml、cdata 或 element)。如果指定Directive,则AttributeName可以为空。这种情况下,列中包含的值直接由具有指定ElementName的元素所包含。 源代码网整理以下Directive 源代码网整理以下是可选命令。如果没有指定Directive,则必须指定AttributeName。如果没有指定AttributeName且没有指定Directive(如 Customer!1),则表示元素命令(如 Customer!1!!element)且包含数据。 源代码网整理以下Directive有两种用途。该选项用于分别使用关键字 ID、IDREF 和 IDREFS 对 ID、IDREF 和 IDREFS 进行编码。还用于表示如何使用关键字 hide、element、xml、xmltext 和 cdata 将字符串数据映射到 XML。大多数情况下允许在这些组中组合指令,但是不能在组本身中进行组合。 源代码网整理以下ID 源代码网整理以下可将元素特性指定为 ID 类型的特性。然后可以使用 IDREF 和 IDREFS 特性引用它们,以启用文档内的链接。但是,如果没有请求 XMLDATA,则此关键字无效。 源代码网整理以下IDREF 源代码网整理以下指定为 IDREF 的特性可用于引用 ID 类型的特性,以启用文档内的链接。但是,如果没有请求 XMLDATA,则此关键字无效。 源代码网整理以下IDREFS 源代码网整理以下指定为 IDREFS 的特性可用于引用 ID 类型的特性,以启用文档内的链接。但是,如果没有请求 XMLDATA,则此关键字无效。 源代码网整理以下hide 源代码网整理以下不显示特性。这对于按照不出现在结果中的特性对结果进行排序可能很有用。 源代码网整理以下element 源代码网整理以下不生成特性。而是生成具有指定名称的包含元素(如果没有指定特性名则直接生成包含元素)。包含数据被编码为实体(例如,字符 < 变成 <)。该关键字可以与 ID、IDREF 或 IDREFS 组合。 源代码网整理以下xml 源代码网整理以下除了不进行实体编码外,该命令与元素命令相同(例如,字符 < 仍是 <)。除了 hide 外,该命令不能与任何其它命令一起使用。 源代码网整理以下xmltext 源代码网整理以下列内容应包在单个标记内,以便与文档的其它部分集成。如果指定了AttributeName,则标记名由指定名称替换;否则通过将内容放在容器的起始处而不进行实体编码,将特性追加到包含元素的当前特性列表。含有该命令的列必须是文本类型(varchar、nvarchar、char、nchar、text、ntext)。该命令只能与 hide 一起使用。在提取存储在列中的溢出数据时该命令很有用。 如果内容不是有效的 XML,则该行为不明确。 源代码网整理以下cdata 源代码网整理以下通过用 CDATA 节环绕数据来包含数据。不对内容进行实体编码。原始数据类型必须是文本类型(varchar、nvarchar、text、ntext)。该命令只能与 hide 一起使用。当使用该命令时,不应指定AttributeName。 源代码网整理以下2.简单查询 源代码网整理以下在指定数据所在的元素的名称和标记时必须使用ElementName参数和Tag参数,也就是查询语句中表中存在的每一个实际的数据列都必须以ElementName!Tag开头。在没有指定AttributeName!Directive的情况下以元素值的形式返回。在只查询一个表的情况下Tag为1,Parent为NULL。 源代码网整理以下使用EXPLICIT模式来查询数据我认为使用倒推的方式会比较方便一些,比如我要得到如下结构, 源代码网整理以下Description 源代码网整理以下查询语句: 源代码网整理以下SELECT 1 AS Tag,NULL AS Parent, 源代码网整理以下CategoryID AS [Category!1!ID], 源代码网整理以下CategoryName AS [Category!1!Name], 源代码网整理以下Description AS [Category!1] 源代码网整理以下FROM Categories 源代码网整理以下WHERE categoryID > 6 FOR XML EXPLICIT 源代码网整理以下返回结果: 源代码网整理以下Dried fruit and bean curd 源代码网整理以下Seaweed and fish 源代码网整理以下当然下面的语句同上面的等效, 源代码网整理以下SELECT 1 Tag,NULL Parent, 源代码网整理以下CategoryID [Category!1!ID], 源代码网整理以下CategoryName [Category!1!Name], 源代码网整理以下Description [Category!1] 源代码网整理以下FROM Categories 源代码网整理以下WHERE categoryID > 6 FOR XML EXPLICIT 源代码网整理以下2.连接查询 源代码网整理以下在EXPLICIT模式下的多表连接查询可能相对比较复杂些,先来看一个简单的例子, 源代码网整理以下查询语句: 源代码网整理以下SELECT 1 AS Tag,NULL AS Parent, 源代码网整理以下Categories.CategoryID AS [Category!1!ID], 源代码网整理以下Categories.CategoryName AS [Category!1!!element], 源代码网整理以下ProductID AS [Category!1!ProductID!element], 源代码网整理以下ProductName AS [Category!1!ProductName!element] 源代码网整理以下FROM Categories 源代码网整理以下JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <5 源代码网整理以下WHERE Categories.CategoryID < 3 FOR XML EXPLICIT 源代码网整理以下返回结果: 源代码网整理以下Beverages 源代码网整理以下1 源代码网整理以下Chai 源代码网整理以下Beverages 源代码网整理以下2 源代码网整理以下Chang 源代码网整理以下Condiments 源代码网整理以下3 源代码网整理以下Aniseed Syrup 源代码网整理以下 源代码网整理以下Condiments 源代码网整理以下4 源代码网整理以下Chef Anton's Cajun Seasoning 源代码网整理以下 源代码网供稿. |
