为了创建图2A所显示的EXPLICIT模式查询,我们对图2的查询进行了如下修改:
增加了第三个子查询提取折扣数据,通过Tag列声明这些数据的标签值为3。
通过指定Parent列为1将折扣数据设置成<Store>元素的子元素。
注意在第三个SELECT子查询中我们只包含了那些必需的列,并用NULL补足空列。这个子查询包含store_name列,虽然Discount元素并不要用到这个列,但如果把这个列也设置为NULL,则结果Universal表将不会按照解析器所要求的那样以节点升序排序(不妨自己试一下看看)。Universal表的排序列也可以用Tag列替代。
为维持结果Universal表的完整性,第一、二两个SELECT语句也用NULL补足以反映为折扣数据增加的列。
为指定新折扣列的元数据修改了第一个SELECT语句。
通过在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
下面这个XML文档只能用EXPLICIT模式生成:

结果XML文档中不会显示出NULL数据,如折扣lowqty和highqty。
看来上面的介绍,大家可能已经对FOR XML的语法有所了解。通过FOR XML 我们在能够在Query Analyzer 中直接返回一个XML格式的数据或者通过其他多样化表现方式将XML格式的数据显示出来,比如可以将数据显示在浏览器上。下面这个例子就使用FOR XML和ADO将数据输出到浏览器的例子。
Dim adoConn Set adoConn = Server.CreateObject("ADODB.Connection")
Dim sConn sConn = "Provider=SQLOLEDB;Data Source=192.168.0.160;Initial Catalog=Northwind;User ID=SA;Password=;" adoConn.ConnectionString = sConn adoConn.CursorLocation = adUseClient adoConn.Open
Dim adoCmd Set adoCmd = Server.CreateObject("ADODB.Command") Set adoCmd.ActiveConnection = adoConn
Dim sQuery ‘定义 FOR XML的查询。具体的语法在以后的章节中将详细介绍。 sQuery = "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'><sql:query>SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO</sql:query></ROOT>"
‘建立ADODB Stream 对象,ADODB Stream 对象需要ADO2.5以上版本支持,它可以将记录集转换为数据流。 Dim adoStreamQuery Set adoStreamQuery = Server.CreateObject("ADODB.Stream") adoStreamQuery.Open adoStreamQuery.WriteText sQuery, adWriteChar adoStreamQuery.Position = 0 adoCmd.CommandStream = adoStreamQuery adoCmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write "Pushing XML to client for processing " & "<BR/>"
adoCmd.Properties("Output Stream") = Response ‘输出XML格式的文本 Response.write "<XML ID=MyDataIsle>" adoCmd.Execute , , adExecuteStream Response.write "</XML>"
‘通过IE的XML解析器,使用DOM方法将XML的文本转换为HTML <SCRIPT language="VBScript" For="window" Event="onload">
Dim xmlDoc Set xmlDoc = MyDataIsle.XMLDocument xmlDoc.resolveExternals=false xmlDoc.async=false
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
|