综合摘要
XML for Analysis 是一种基于简单对象访问协议 (Simple Object Access Protocol, SOAP) 的 XML API,按照设计,专门用于对在 Web 上工作的客户端应用程序和数据提供程序之间的数据访问交互进行标准化处理。
当前,在传统数据访问技术(如 OLE DB 和 ODBC)条件下,客户端计算机上必须安装与数据提供程序服务器紧密耦合在一起的客户端组件,才能使应用程序能够访问来自数据提供程序的数据。紧密耦合的客户端组件可以基于以下内容建立相关性:特定的硬件平台、特定的操作系统、特定的接口模型、特定的编程语言以及客户端和服务器组件版本的特定匹配。
对安装客户端组件的要求和与紧密耦合结构相关的相关性不适合 Internet 环境,因为该环境是松散结合的、无状态的、跨平台的且与语言无关。要提供对 Web 应用程序的可靠数据访问,Internet、移动设备和跨平台的桌面系统需要一种标准方法,该方法并不要求将组件下载到客户端上。
可扩展标记语言 (XML) 是一种通用的且可以随处访问的语言。如果您不必调用专用的客户端组件接口就可以在不借助客户端组件的情况下调用方法并通过 XML HTTP 消息传递数据,会怎么样?如果应用程序开发人员可以在不考虑与服务器组件或应用程序的紧密耦合的情况下构建客户端组件,会怎么样? 如果利用任何编程语言编写的且可运行在任何平台上的应用程序都可以从 Web 上的任何位置访问数据,而不必考虑具体的平台支持,甚至不用考虑特定的提供程序版本,则情况会怎样呢?本规范将通过 XML for Analysis 回答这些问题。
XML for Analysis 扩展了 OLE DB 的概念,它提供了对 Web 上所有标准数据源的标准化通用数据访问,而无需对提供 COM 接口的客户端组件进行部署。XML for Analysis 专门为 Web 进行了优化,因为它极大地减少了到服务器的往复并且专门针对使用无状态的客户端请求,从而极大地提高了数据源的可伸缩性和强壮性。
本规范定义了两种方法: Discover 和 Execute ,这两种方法使用并发送 XML,以发现并控制无状态数据。
本规范建立在 HTTP、XML 和 SOAP 等开放式 Internet 标准之上,不受任何具体语言或技术的限制。本规范中也讨论了 OLE DB,使已经熟悉 OLE DB 的应用程序开发人员可以了解 XML for Analysis 的映射和实现方法。这些涉及的内容还为本规范扩展出来的 OLE DB 定义提供背景信息。
读者
本规范的目标读者是应用程序开发人员,并认为他们已熟悉以下内容:
XML 知识
SOAP 知识
理解联机分析处理 (OLAP) 和数据挖掘
具有使用 OLE DB 和 OLE DB for OLAP 的经验
有关这些知识面的详细信息,请参见 附录 E 。
设计目的
本规范的主要目的包括:
为远程数据访问提供程序(可通用于 Internet 或 Intranet,提供多维数据)提供标准数据访问 API
优化无状态结构,不要求 Web 客户端组件,往返调用最少
支持使用任何工具、编程语言、技术、硬件平台或设备的、与技术无关的实现过程
建立在开放式 Internet 标准(如 SOAP、XML 和 HTTP)之上
利用并重复使用成功的 OLE DB 设计概念,使 OLE DB for OLAP 应用程序和 OLE DB 提供程序可轻松采用 XML for Analysis
高效使用标准数据源(如关系型 OLAP 和数据挖掘)
设计摘要
设计以基于 XML 通信的 API 为中心,该 API 称为 XML for Analysis,它定义两种通常可访问的方法: Discover 和 Execute 。由于 XML 考虑到松散耦合的客户端和服务器结构,所以两种方法都以 XML 格式处理传入和传出的信息。该 API 为 Internet 进行了优化,在 Internet 中,对服务器的往返调用在时间上和资源上都是成本昂贵的,而且对数据的有状态连接将限制服务器上的用户连接数。
Discover 用于从 Web 服务获取信息和元数据。该信息可以包括一系列可用数据源和有关特定数据源的提供程序的数据。属性用于定义并描述获取哪些数据。客户端应用程序可能需要多种类型的信息,而 Discover 使您可以通过常规方式来指定这些信息。属性的这种通用接口及使用允许扩展,而不必重写现有函数。
Execute 用于针对特定的 XML for Analysis 数据源执行多维表达式 (MDX) 或其它提供程序特定的命令。下图例展示了 n 层应用程序的一种可能的实现过程。

在获得驻留 Web 服务的服务器的 URL 之后,客户端将使用 SOAP 和 HTTP 协议向服务器发出 Discover 和 Execute 调用。服务器将 XML for Analysis 提供程序实例化,用于处理 Discover 和 Execute 调用。XML for Analysis 提供程序提取数据,将其打包到 XML 中,然后将所请求的数据作为 XML 发送到客户端。
Discover 和 Execute 方法使用户可以确定在特定服务器上可以查询的内容,并据此提交要执行的命令。下例演示了 Internet 应用程序或 Web 服务如何使用这些方法。
** 第一部分 - XML for Analysis **
XML for Analysis 简介
XML for Analysis 指定基于 SOAP 的 XML 通信 API,它支持在任何平台上使用任何语言在客户端和服务器之间进行分析数据交换。
方法
以下方法为 XML 应用程序访问服务器上的基本信息提供了一种标准方式。由于这些方法是使用 SOAP 协议调用的,所以它们以 XML 格式接受输入并发送输出。默认情况下,这些方法是无状态的,所以服务器上下文将在任何命令结束时终止。有关如何发出有状态调用的信息,请参见 XML for Analysis 中对有状态的支持 。
简化接口模型具有两种方法。 Discover 方法获取信息,而 Execute 方法将操作请求发送到服务器。这些方法的 XML 名称空间为 "urn:schemas-microsoft-com:xml-analysis" .
在每次方法调用中,连接信息都通过连接属性提供。
Discover
Discover 方法可以用于检索信息,如服务器上的可用数据源列表或有关特定数据源的详细信息。利用 Discover 方法检索到的数据取决于传递给它的参数值。
名称空间
urn:schemas-microsoft-com:xml-analysis
SOAP 操作
"urn:schemas-microsoft-com:xml-analysis:Discover"
语法
Discover (
[in] _RequestType_ As EnumString,
[in] _Restrictions_ As Restrictions,
[in] _Properties_ As Properties,
[out] _Result_ As Rowset)
参数
RequestType [in]
该参数是必需的,它由 RequestTypes 枚举值组成,决定要返回的信息的类型。 Discover 方法使用 RequestTypes 枚举决定 Result 参数中所返回行集的结构和内容。 Restrictions 参数的格式以及生成的 XML 结果集也取决于在该参数中指定的值。可以对该枚举进行扩展,以支持提供程序特定的枚举字符串。
每个 RequestTypes 枚举值都与一个返回行集相对应。有关行集定义,请参见 XML for Analysis 行集 。需要对以下明确命名的 RequestTypes 枚举值进行支持。
| 枚举值 | 说明 |
|---|---|
| DISCOVER_DATASOURCES | 返回服务器或 Web 服务上可用的 XML for Analysis 数据源列表。(有关其发布方法的示例,请参见 XML for Analysis 实现过程分步说明 。) |
| DISCOVER_PROPERTIES | 返回有关所请求属性的信息和值的列表,这些被请求的属性受指定的数据源(提供程序)支持。 |
| DISCOVER_SCHEMA_ROWSETS | 返回所有受支持的 RequestTypes 枚举值(包括在这里列出的值)的名称、值和其它信息,以及任何其它提供程序特定的枚举值。 |
| DISCOVER_ENUMERATORS | 返回特定数据源提供程序所支持的名称、数据类型和枚举器的枚举值的列表。 |
| DISCOVER_KEYWORDS | 返回包含提供程序所保留关键字列表的行集。 |
| DISCOVER_LITERALS | 返回数据源提供程序所支持的直接量的信息。 |
| Schema Rowset Constant | 在给定与 OLE DB 所定义的架构行集名称之一相对应的常量(如 MDSCHEMA_CUBES)的情况下,返回 XML 格式的 OLE DB 架构行集。注意:提供程序也可能通过提供其它提供程序特定的架构行集来扩展 OLEDB。表格数据提供程序 (TDP) 和多维数据提供程序 (MDP) 应支持的架构行集列在 DISCOVER_SCHEMA_ROWSETS 行集 一节中。 |
Restrictions [in]
该参数属于 Restrictions 数据类型,它使用户可以限制 Result 中返回的数据。 Result 列是由 RequestType 参数中指定的行集定义的。某些 Result 列可以用于筛选所返回的行。有关这些列以及可以被限制的列的信息,请参见 XML for Analysis 行集 中的行集表。要获取提供程序特定的架构行集的限制信息,请使用 DISCOVER_SCHEMA_ROWSETS 请求类型。
该参数必须包含在内,但可以为空。
Properties [in]
该参数属于 Properties 数据类型,它由 XML for Analysis 属性的集合构成。每个属性都可以使用户控制 Discover 方法的某一方面,如指定结果集、超时的返回格式,以及指定数据格式的区域设置。
要获取可用属性及其值,可以用 Discover 方法并使用 DISCOVER_PROPERTIES 请求类型。标准 XML for Analysis 属性的详细信息将在 XML for Analysis 属性 中介绍。
列在 Properties 参数中的属性没有顺序要求。该参数必须包含在内,但可以为空。
Result [out]
该参数是必需的,它包含提供程序作为 Rowset 对象返回的结果集。
结果集的列和内容由在 RequestType 和 Restrictions 参数中指定的值决定。所返回结果集的列布局也由在 RequestType 中指定的值决定。有关与各 RequestType 值相对应的行集布局的详细信息,请参见 XML for Analysis 行集 。
有关 Rowset 数据类型的详细信息,请参见 XML for Analysis 中使用的数据类型 。
示例
在下面的示例中,客户端发出 XML Discover 调用,向 FoodMart 2000 目录请求多维数据集列表:
1<discover soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns="urn:schemas-microsoft-com:xml-analysis">
2<requesttype>MDSCHEMA_CUBES</requesttype>
3<restrictions>
4<restrictionlist>
5<catalog_name>
6 FoodMart 2000
7 </catalog_name>
8</restrictionlist>
9</restrictions>
10<properties>
11<propertylist>
12<datasourceinfo>
13 Provider=MSOLAP;Data Source=local;
14 </datasourceinfo>
15<catalog>
16 Foodmart 2000
17 </catalog>
18<format>
19 Tabular
20 </format>
21</propertylist>
22</properties>
23</discover>
提供程序把以下结果返回到客户端:
1<soap-env:envelope soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
2<soap-env:body>
3<discoverresponse xmlns="urn:schemas-microsoft-com:xml-analysis">
4<return>
5<root>
6<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
7<!-- 结果的 XML 架构定义出现在这里 -->
8 ...
9 </xsd:schema>
10<row>
11<catalog_name>FoodMart 2000</catalog_name>
12<cube_name>Sales</cube_name>
13 ...
14 </row>
15<row>
16<catalog_name>FoodMart 2000</catalog_name>
17<cube_name>Warehouse</cube_name>
18 ...
19 </row>
20 ...
21 </root>
22</return>
23</discoverresponse>
24</soap-env:body>
25</soap-env:envelope>
Execute
Execute 方法用于向服务器发出操作请求。其中包括涉及数据传输的请求,如检索或更新服务器上的数据。
名称空间
urn:schemas-microsoft-com:xml-analysis
SOAP 操作
"urn:schemas-microsoft-com:xml-analysis:Execute"
语法
Execute (
[in] Command As Command,
[in] Properties As Properties,
[out] Result As Resultset)
参数
Command [in]
该参数是必需的,它属于 Command 数据类型,由要执行的提供程序特定的语句组成。XML for Analysis 多维提供程序必须支持 mdXML 语言,但也可以根据需要支持其它命令。
Properties [in]
该参数属于 Properties 数据类型,它由 XML for Analysis 属性的集合组成。每个属性都允许用户控制 Execute 方法的某一方面,如定义连接所要求的信息、指定结果集的返回格式或指定数据格式的区域设置。
要获取可用属性及其值,可以用 Discover 方法并使用 DISCOVER_PROPERTIES 请求类型。标准 XML for Analysis 属性的详细信息将在 XML for Analysis 属性 中介绍。
列在 Properties 参数中的属性没有顺序要求。该参数必须包含在内,但可以为空。
Result [out]
该参数包含提供程序所返回的 Resultset 结果。 Command 参数和 Properties 参数中的值将定义结果集的形状。如果没有传递任何形状定义属性,XML for Analysis 提供程序将使用默认形状。
本规范所定义的两种结果集格式为表格式 (Tabular) 和多维式 (Multidimensional),符合客户端通过 Format 属性指定的格式。OLAP 数据使用多维格式(虽然也可以使用表格格式)。提供程序可能还支持其它行集类型,了解这些特殊类型的客户端可以对它们进行请求。
示例
以下是一个 Execute 方法调用的示例,其 `
1<statement> ` 设置为 OLAP MDX SELECT 语句:
2
3
4 <execute soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns="urn:schemas-microsoft-com:xml-analysis">
5<command/>
6<statement>
7 select [Measures].members on Columns from Sales
8 </statement>
9<command/>
10<properties>
11<propertylist>
12<datasourceinfo>
13 Provider=Essbase;Data Source=local;
14 </datasourceinfo>
15<catalog>Foodmart 2000</catalog>
16<format>Multidimensional</format>
17<axisformat>ClusterFormat</axisformat>
18</propertylist>
19</properties>
20</execute>
21
22
23
24
25这是对前述方法调用的简要响应:
26
27
28 <?xml version="1.0"?>
29<soap-env:envelope soap-env="http://schemas.xmlsoap.org/soap/envelope/" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:="">
30<soap-env:body>
31<m:executeresponse xmlns:m="urn:schemas-microsoft-com:xml-analysis">
32<m:return soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">
33<root>
34<xsd:schema xmlns:xars="urn:schemas-microsoft-com:xars" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
35 ...<!--—数据的架构出现在这里。-- -->
36</xsd:schema>
37 ... <!--—MDDataSet 格式的数据出现在这里。-- -->
38</root>
39</m:return>
40</m:executeresponse>
41</soap-env:body>
42</soap-env:envelope>
43
44
45## XML for Analysis 中使用的数据类型
46
47以下按字母顺序排列的列表对 XML for Analysis 数据类型进行了说明并对使用标准 XML 数据类型的数据类型进行了标注。有关 XML 架构类型的详细信息,请参见 http://www.w3.org/TR/xmlschema-2/ 。
48
49### Boolean
50
51Boolean 型使用标准 XML 布尔型数据类型。
52
53XML 布尔型数据类型用 1 表示 True(真),用 0 表示 False(假)。
54
55### Decimal
56
57本文所述的 Decimal 型使用标准 XML 十进制数据类型。
58
59### Integer
60
61本文所述的 Integer 型是指标准 XML 整数数据类型。
62
63### EnumString
64
65EnumString 数据类型为给定的枚举器 (enum) 定义一组已命名常量。EnumString 使用标准 XML 字符串数据类型。每个已命名常量的具体值都是用枚举器定义指定的。
66
67### MDDataSet
68
69MDDataSet 格式是 **Execute** 方法的 _Result_ 参数可以返回的格式之一。该格式用于多维数据。用 XML 表示 OLAP 数据要求针对 OLAP 的行集(或数据集),本文对其进行了说明。MDDataSet 数据类型的 XML 名称空间为 ` "urn:schemas-microsoft-com:xml-analysis:mddataset" ` .
70
71有关 OLE DB for OLAP 数据集结构的基本信息,请参见 MDDataset 数据类型到 OLE DB 的映射 。有关 MDDataSet 的完整 XML 架构定义 (XSD) 的示例,请参见 附录 D 。
72
73本规范为 OLAP 结果定义以下 XML 结构。MDDataSet 由三个主要部分组成:
74
75 * OLAPInfo:定义结果的结构,列出并说明将使用的坐标轴和单元格
76
77
78 * Axes:包含在 OLAPInfo 结构中定义的坐标轴的数据
79
80
81 * CellData:包含在 OLAPInfo 结构中定义的单元格的数据
82
83
84
85提供程序只要不更改这里所定义架构的行为和含义,就可以在结构中添加其它批注。这种开放式内容架构模型允许从其它名称空间添加新元素和特性,但不允许更改所定义的元素和特性的语义。
86
87#### OLAPInfo
88
89为了定义结构, ` <olapinfo> ` 首先使用 ` <axesinfo> ` 元素(注意是复数形式 Axes)来定义坐标轴。坐标轴由一组 ` <axisinfo> ` 元素(注意是单数形式 Axis)组成,这些元素的别名是序列化的,如 ` name="Axis0" ` 。然后,维层次结构连同其属性定义一起列出。在随后的示例中,标准成员属性用 ` <hierarchyinfo> ` 元素进行表示,包括 UName、Caption、LName 和 LNum,以及非标准 DisplayInfo 元素。对于 Store 层次结构,附加的(非标准)带空格字符的成员属性用 [Store].[Store SQFT] 进行说明。
90
91
92 <olapinfo>
93<axesinfo>
94<axisinfo name="Axis0">
95<hierarchyinfo name="Measures">
96<uname name="[Measures].[MEMBER_UNIQUE_NAME]"></uname>
97<caption name="[Measures].[MEMBER_CAPTION]"></caption>
98<lname name="[Measures].[LEVEL_UNIQUE_NAME]"></lname>
99<lnum name="[Measures].[LEVEL_NUMBER]"></lnum>
100<displayinfo name="[Measures].[DISPLAY_INFO]"></displayinfo>
101</hierarchyinfo>
102</axisinfo>
103<axisinfo name="Axis1">
104<hierarchyinfo name="Store">
105<uname name="[Store].[MEMBER_UNIQUE_NAME]"></uname>
106<caption name="[Store].[MEMBER_CAPTION]"></caption>
107<lname name="[Store].[LEVEL_UNIQUE_NAME]"></lname>
108<lnum name="[Store].[LEVEL_NUMBER]"></lnum>
109<displayinfo name="[Store].[DISPLAY_INFO]"></displayinfo>
110<store_x0020_sqft name="[Store].[Store Name].[Store SQFT]">
111</store_x0020_sqft>
112</hierarchyinfo>
113<hierarchyinfo name="Time">
114<uname name="[Time].[MEMBER_UNIQUE_NAME]"></uname>
115<caption name="[Time].[MEMBER_CAPTION]"></caption>
116<lname name="[Time].[LEVEL_UNIQUE_NAME]"></lname>
117<lnum name="[Time].[LEVEL_NUMBER]"></lnum>
118<displayinfo name="[Time].[DISPLAY_INFO]"></displayinfo>
119</hierarchyinfo>
120</axisinfo>
121
122
123OLAPInfo 结构定义的最后一项内容是单元格的属性(列定义)。这使单元格可以包含其它属性。本示例中的属性为 Value、FmtValue 和自定义的属性 FormatString。
124
125
126 <olapinfo>
127 ...
128 <cellinfo>
129<value name="VALUE"></value>
130<fmtvalue name="FORMATTED_VALUE"></fmtvalue>
131<formatstring name="FORMAT_STRING"></formatstring>
132</cellinfo>
133
134
135#### HierarchyInfo 标准元素
136
137以下标准元素是 ` <hierarchyinfo> ` 元素所要求的元素。MDSCHEMA 引用是指 OLE DB for OLAP 架构定义。
138
139**元素** | **说明**
140---|---
141UName | 来自 OLE DB 坐标轴行集的 MEMBER_UNIQUE_NAME 属性
142Caption | 来自 OLE DB 坐标轴行集的 MEMBER_CAPTION 属性
143LName | 来自 OLE DB 坐标轴行集的 LEVEL_UNIQUE_NAME 属性
144LNum | 来自 OLE DB 坐标轴行集的 LEVEL_NUMBER 属性
145
146
147
148#### CellInfo 标准元素
149
150以下是 ` <cellinfo> ` 元素的标准元素。特定查询是否能够返回这些标准元素则取决于查询本身。
151
152**元素** | **说明**
153---|---
154Value | 来自 OLE DB 单元格属性的 VALUE 属性
155FmtValue | 来自 OLE DB 单元格属性的 FORMATTED_VALUE 属性
156ForeColor | 来自 OLE DB 单元格属性的 FORE_COLOR 属性
157BackColor | 来自 OLE DB 单元格属性的 BACK_COLOR 属性
158
159
160
161#### 在 CellInfo 和 AxisInfo 中使用默认值
162
163提供程序可以选择性地为 AxisInfo 或 CellInfo 部分中的单个成员或单元格属性指定默认值。如果同一属性总是具有或常常具有相同的值,可减小结果的大小。
164
165可以选择性地将 ` <default> ` 元素指定为某个成员属性元素或单元格属性元素的子元素,用以表示该属性的默认值。例如,如果提供程序要为 Store SQFT 指定默认值,可以这样来指定:
166
167
168 <store_x0020_sqft name="Store SQFT">
169<default>5000</default>
170</store_x0020_sqft>
171
172
173这样,如果结果中没有某个成员属性或单元格属性,则表示该成员属性或单元格属性的值为所声明的默认值。在以下结果中,完全没有 ` <store_x0020_sqft> ` 元素的输出,则 ` <store_x0020_sqft> ` 的值为 5000(以上所定义的默认值):
174
175
176 <member hierarchy="Store">
177<uname>[Store].[CA]</uname>
178<caption>CA</caption>
179<lname>[Store].[State]</lname>
180<lnum>2</lnum>
181</member>
182
183
184如果元素存在,但没有值,这表示空字符串结果 (""),如下例所示:
185
186
187 <store_x0020_sqft></store_x0020_sqft>
188
189
190通常,如果属性为 NULL,将被忽略。但如果已经为属性定义了默认值,则如要为属性指定 NULL 值,应使用 XML 架构规范中的空特性,如下所示:
191
192
193 <store_x0020_sqft xsi:null="true"></store_x0020_sqft>
194
195
196#### Axes
197
198在 Axes 下,Axis 项将从零开始,按照它们在数据集中的顺序列出。 **AxisFormat** 属性设置决定各 Axis 元素的格式。所有 XML for Analysis 提供程序都必须支持属性 AxisFormat 的以下值:
199
200 * ClusterFormat
201
202
203 * TupleFormat
204
205
206 * CustomFormat
207
208
209
210提供程序可以选择性地支持将 CustomFormat 值作为单独的格式。如果客户端请求 CustomFormat,提供程序可以根据判断选择返回 TupleFormat 和 ClusterFormat 格式之一。虽然提供程序必须支持上述全部三种值,但客户端可以请求其需要的格式;所以客户端可以选择不使用所有这三种可用的格式。
211
212#### 为什么会有不同的格式?
213
214AxisFormat 属性的 TupleFormat 和 ClusterFormat 设置提供两种不同的表示元组的方法。MDDataset 定义赋予提供程序两种指定元组的方法:将其指定为多维元组或将其指定为笛卡尔乘积。这使客户端应用程序可以在简单性和降低空间要求之间进行选择。
215
216坐标轴表示一个元组集,该集中的所有元组都具有相同的维数。可以用不同的方法表示该集,不同的方法有不同的优点。例如,下面的四元组集可以表示为二维元组集合或两个一维集的笛卡尔乘积。
217
2181999 | 1999 | 2000 | 2000
219---|---|---|---
220Actual | Budget | Actual | Budget
221
222
223
224下面的行将四元组集表示为二维元组集合:
225
226
227 { ( 1999, Actual), ( 1999, Budget), ( 2000, Actual), ( 2000, Budget) }
228
229
230下面的行将四元组集表示为两个一维集的笛卡尔乘积:
231
232
233 { 1999, 2000 } x {Actual, Budget}
234
235
236两种表示方法各具优缺点。二维元组易于客户端工具使用。一维集的笛卡尔乘积占用的空间较小,并且保留了集的多维本质。
237
238下表列出了可以用于定义和描述坐标轴结构和成员的操作。
239
240**操作** | **说明**
241---|---
242Member | 表示维层次结构成员的坐标轴的最小单位
243Tuple | 来自不同维层次结构的成员向量
244Members | 来自同一维层次结构的成员对象集
245Tuples | 具有相同维数的元组对象集合
246Union | 集联合
247CrossProduct | 集的笛卡尔乘积
248
249
250
251根据前面的示例,这些操作将把二维元组和一维集的笛卡尔乘积转换为如下形式。
252
253** 二维元组 **
254
255
256 Tuples (
257 Tuple( Member(1999), Member(Actual) ),
258 Tuple( Member(1999), Member(Budget) ),
259 Tuple( Member(2000), Member(Actual) ),
260 Tuple( Member(2000), Member(Budget) )
261 )
262
263
264** 一维集的笛卡尔乘积 **
265
266
267 CrossProduct (
268 Members (Member(1999), Member(2000) ),
269 Members (Member(Actual), Member(Budget)
270 )
271
272
273这些操作的 XML 表示法遵循这些规则(其中 _member_properties_ 值是指在相应的 AxisInfo 部分所定义的成员属性列表):
274
275_member_ : <member> _member_properties_ </member>
276
277_tuple_ : <tuple> _member_list_ </tuple>
278
279_set_ : <members> _member_list_ </members>
280
281_set_ : <tuples> _tuple_list_ </tuples>
282
283_set_ : <crossproduct> _set_list_ </crossproduct>
284
285_set_ : <union> _set_list_ </union>
286
287_member_list_ : _member_ [ _member_ ... ]
288
289_tuple_list_ : _tuple_ [ _tuple_ ... ]
290
291_set_list_ : _set_ [ _set_ ... ]
292
293如上所示,使用不同的操作,相同的集可以有不同的表示方法。客户端可以使用 AxisFormat 属性请求具体的表示方法。
294
295#### TupleFormat
296
297在 TupleFormat 中,坐标轴表示为元组集。下列操作必须按指定的顺序使用:
298
299
300 <axis>
301<tuples>
302<tuple>
303<member hierarchy=" _name_ ">
304
305
306另外, ` <member> ` 元素必须具有指定成员层次结构名称的 **Hierarchy** 特性。
307
308下例说明 TupleFormat。
309
310**1999** | **1999** | **2000**
311---|---|---
312Actual | Budget | Budget
313
314
315
316
317 <axes>
318<axis name="Axis0">
319<tuples>
320<tuple>
321<member hierarchy="Time">
322<uname>[Time].[1999]</uname>
323 ? </member>
324<member hierarchy="Category">
325<uname>[Scenario].[Actual]</uname>
326 ? </member>
327</tuple>
328<tuple>
329<member hierarchy="Time">
330<uname>[Time].[1999]</uname>
331 ? </member>
332<member hierarchy="Category">
333<uname>[Scenario].[Budget]</uname>
334 ? </member>
335</tuple>
336<tuple>
337<member hierarchy="Time">
338<uname>[Time].[2000]</uname>
339 ? </member>
340<member hierarchy="Category">
341<uname>[Scenario].[Budget]</uname>
342 ? </member>
343</tuple>
344</tuples>
345</axis>
346 ...
347 </axes>
348
349
350#### ClusterFormat
351
352在 ClusterFormat 中,坐标轴表示为一组群集。每个群集都表示一个来自不同维层次结构成员的交叉乘积。提供程序将定义自己特定的群集算法。以下操作必须按指定的顺序使用:
353
354
355 <axis>
356<crossproduct size=" _size_ ">
357<members hierarchy=" _name_ ">
358<member>
359
360
361要将对象表示为群集, ` <crossproduct> ` 元素必须具有 **Size** 特性,该特性表示 CrossProduct 中单个 Member 集乘积生成的元组数。而 ` <members> ` 元素必须具有 **Hierarchy** 特性,该特性指定集中所有成员的维层次结构的名称。
362
363交叉乘积可能包含来自单个维层次结构的成员。
364
365以下示例对两个群集进行了说明:
366
367**1999** | **1999** | **2000** | **2000** | **2001**
368---|---|---|---|---
369Actual | Budget | Actual | Budget | Budget
370_cluster 1_ | _cluster 2_
371
372
373
374
375 <axes>
376<axis name="Axis0">
377<crossproduct size="4">
378<members hierarchy="Time">
379<member>
380<uname>[Time].[1999]</uname>
381 ? </member>
382<member>
383<uname>[Time].[2000]</uname>
384 ? </member>
385</members>
386<members hierarchy="Category">
387<member>
388<uname>[Scenario].[Actual]</uname>
389 ? </member>
390<member>
391<uname>[Scenario].[Budget]</uname>
392 ? </member>
393</members>
394</crossproduct>
395<crossproduct size="1">
396<members hierarchy="Time">
397<member>
398<uname>[Time].[2001]</uname>
399 ? </member>
400</members>
401<members hierarchy="Category">
402<member>
403<uname>[Scenario].[Budget]</uname>
404 ? </member>
405</members>
406</crossproduct>
407</axis>
408 ?</axes>
409
410
411#### CustomFormat
412
413CustomFormat 允许提供程序以任何以上各节中所定义的操作的有效组合来生成坐标轴,但有如下限制:
414
415 * 只有 ` <union> ` 、 ` <crossproduct> ` 、 ` <members> ` 和 ` <tuples> ` 元素才能作为坐标轴的第一个子项出现。
416
417
418 * ` <tuple> ` 元素下的 ` <member> ` 元素必须包含 **Hierarchy** 特性,表示成员所属层次结构的名称。
419
420
421 * ` <members> ` 元素必须包含 **Hierarchy** 特性,表示集中所有成员的层次结构名称。
422
423
424
425CustomFormat 最大限度地加强了提供程序的灵活性和功能,从而最优表示坐标轴。
426
427本节是一个示例,演示提供程序将为 CustomFormat 选择返回的内容。
428
429**WA** | **WA** | **CA** | **CA**
430---|---|---|---
431Umbrella(雨伞) | Umbrella(雨伞) | Sunglasses(太阳眼镜) | Sunglasses(太阳眼镜)
432Actual | Budget | Actual | Budget
433
434
435
436提供程序可以选择为 CustomFormat 结果生成以下表示法。在此例中,元组集与成员集交叉相乘。
437
438
439 CrossProduct(
440 Tuples (
441 Tuple ( Member(WA), Member(Umbrella) ),
442 Tuple ( Member(CA), Member(Sunglasses) ) ),
443 Members ( Member(Actual), Member(Budget) )
444 )
445
446
447上面的理论公式可以用 XML 表示成如下形式:
448
449
450 <axis name="Axis0">
451<crossproduct>
452<tuples>
453<tuple>
454<member hierarchy="Store">
455<uname>[Store].[WA]</uname>
456 ...
457 </member>
458<member hierarchy="Product">
459<uname>[Product].[Umbrella]</uname>
460 ...
461 </member>
462</tuple>
463<tuple>
464<member hierarchy="Store">
465<uname>[Store].[CA]</uname>
466 ...
467 </member>
468<member hierarchy="Product">
469<uname>[Product].[Sunglasses]</uname>
470 ...
471 </member>
472</tuple>
473</tuples>
474<members hierarchy="Category">
475<member>
476<uname>[Category].[Actual]</uname>
477 ...
478 </member>
479<member>
480<uname>[Category].[Budget]</uname>
481 ...
482 </member>
483</members>
484</crossproduct>
485</axis>
486
487
488#### CellData
489
490Axes 部分之后是 CellData 部分,其中包含每个单元格的属性值。强制的 **CellOrdinal** 特性表示单元格的序数。对于 _n_ 个单元格, **CellOrdinal** 的编号为从 0 到 _n-1_ 。如果所有单元格属性都为默认值(如果没有指定默认值,则默认值为 NULL),可没有单元格元素。注意, ` <value> ` 元素的类型必须在 CellData 部分指定,而对于其它标准属性,由于其类型在架构中定义,所以无需指定类型。
491
492
493 <celldata>
494<cell cellordinal="0">
495<value xsi:type="xsd:double">16890</value>
496<fmtvalue>16,890.00</fmtvalue>
497<formatstring>Standard</formatstring>
498</cell>
499<cell cellordinal="1">
500<value xsi:type="xsd:int">50</value>
501<fmtvalue>50</fmtvalue>
502<formatstring>Standard</formatstring>
503</cell>
504<cell cellordinal="2">
505<value xsi:type="xsd:double">36175.2</value>
506<fmtvalue>$36,175.20</fmtvalue>
507<formatstring>Currency</formatstring>
508</cell>
509</celldata>
510
511
512单元格的坐标轴引用可以根据 CellOrdinal 计算。从概念上说,单元格在数据集中的编号就如同该数据集为 _p_ 维数组一样,其中 _p_ 为坐标轴数。各单元格是按以行为主的顺序安排的。下图是计算单元格序号的公式。
513
514
515
516我们将把上述公式应用于下表中显示的结果集。该查询要求在列上有四个值,而在行上有两个州和四个季度的交叉相乘。在以下数据集结果中,显示在框中的数据集结果部分的 **CellOrdinal** 属性为集 {9, 10, 11, 13, 14, 15, 17, 18, 19}。这是因为单元格是以行为主的顺序排列的,其开始位置为左上角单元格的零 **CellOrdinal** 。
517
518接着,我们将把上述公式应用于单元格 {CA, Q3, Store Cost}。坐标轴 k=0 具有 U k =4 个成员,而坐标轴 k=1 具有 U k =8 个元组。P 为查询中的坐标轴总数,在这里等于 2。S 0 为 i=0 到 1 的初始和。对于 i=0,{Store Cost} 在坐标轴 0 上的元组序数为 1。对于 i = 1,{CA, Q3} 的元组序数为 2。
519
520对于 i=0,E i = 1,所以,对于 i = 0,和为 1 * 1 = 1,而对于 i=1,和为 2(元组序数)* 4(E i 的值,按 1 * 4 计算),或 8,这样,和为 1 + 8 = 9,为该单元格的序数。
521
522
523
524上述数据集的完整 XML 输出显示在 附录 D 中。
525
526### Command
527
528Command 数据类型是一种 XML 文档类型。在本版本的 XML for Analysis 规范中,Command 数据类型仅由 ` <statement> ` 标记组成,属于类型字符串,包含命令语句的文本。例如,带有 MDX 语句的 ` <statement> ` 元素可以是如下的样子:
529
530
531 <statement>
532 SELECT Measures.MEMBERS on columns from Sales
533 </statement>
534
535
536在以后版本的规范中,Command 数据类型的 XML 文档将超出本文档中定义的单个 < ` Statement ` > 元素。
537
538XML for Analysis 规范要求多维提供程序支持 mdXML 语言。mdXML 语言将以 MDX 为基础;目前 mdXML 仅由 ` <statement **=""> ** ` 元素组成。对于多维提供程序,< ` Statement ` > 元素必须包含 MDX 语言语句。mdXML 以后的增强版本将会在现有 ` ** < ** Statement ** > ** ` 元素之外添加另一些元素。 ` <statement> ` 元素将继续支持把 MDX 语句作为类型字符串,即使对它进行了扩展,也会使其支持其它 XML 元素。
539
540除了 mdXML 以后的增强版本外,MDX 语言本身是可扩展的,这样,提供程序可以对该语言进行扩展,以支持其它在基本语言集中没有提供的功能。有关 mdXML 的详细信息,请参见 MDX 和 mdXML 间的关系 一节。
541
542### Properties
543
544Properties 数据类型表示 XML for Analysis 属性的集合。各属性都由 XML 元素定义,而属性值则为 XML 元素所包含的数据。XML 元素的名称与属性的名称相对应。
545
546各提供程序可以扩展属性集,但提供程序特定的属性名称必须是格式严谨的 XML 标记。
547
548示例:
549
550
551 <propertylist>
552<datasourceinfo>
553 Provider=MSOLAP;Data Source=local;
554 </datasourceinfo>
555<catalog>
556 Foodmart 2000
557 </catalog>
558<format>
559 Multidimensional
560 </format>
561</propertylist>
562
563
564### Restrictions
565
566Restrictions 数据类型表示在执行 **Discover** 方法的过程中,所要应用的限制的集合。Restriction 名称指定被限制的行集列的名称。Restriction 值定义列的数据。
567
568各提供程序都可以添加新的架构行集,但要使列可以被限制,其名称必须符合 XML 格式完好性约束。
569
570以下示例将对 MDSCHEMA_CUBES 架构行集中的列名称进行限制:
571
572
573 <restrictionlist>
574<catalog_name>
575 FoodMart 2000
576 </catalog_name>
577 ...
578 </restrictionlist>
579
580
581需要时,可以用多个值对列进行限制。每个值都用 ` <value> ` 元素表示。示例:
582
583
584 <restrictionlist>
585<literalname>
586<value>DBLITERAL_QUOTE_PREFIX</value>
587<value>DBLITERAL_QUOTE_SUFFIX</value>
588<value>DBLITERAL_ESCAPE_UNDERSCORE_PREFIX</value>
589<value>DBLITERAL_ESCAPE_UNDERSCORE_SUFFIX</value>
590</literalname>
591 ...
592 </restrictionlist>
593
594
595### Resultset
596
597Resultset 数据类型是一种自我说明型的 XML 结果集。它将包含的数据类型是由 XML for Analysis Format 属性表示的。
598
599在默认情况下,XML 架构是与结果集一起返回的。可以使用 Content 属性来改变这种情况,如 XML for Analysis 属性 中所述。
600
601### Rowset
602
603在行集中嵌入的 XML 架构定义 **Rowset** 返回数据类型的具体结构。XML for Analysis 行集的一般结构类似于通过 FOR XML RAW 子句获取的 Microsoft® SQL Server™ 2000 行集的格式,但它是以元素为中心的,而不是以特性为中心,并且允许使用层次结构数据。
604
605XML 不允许将特定的字符当作元素和特性的名称。XML for Analysis 支持按 SQL Server 2000 中的定义进行编码来解决这一 XML 约束。对于包含无效 XML 名称字符(根据 XML 1.0 规范)的列名称,将使用相应的十六进制值对无效的 Unicode 字符进行编码。这些值转义表示为 _x _HHHH_ _,其中 _HHHH_ 表示字符的四位十六进制 UCS-2 代码,高位在前。例如,名称“Order Details”的编码为 Order __x0020__ Details,其中的空格字符被相应的十六进制代码替代。
606
607编码会使可扩展样式语言 (XSL) 转换变得困难。为了支持对实际上未进行编码的列名称进行快速查找,可以将 **sql:field** 特性添加到 XML 行集架构中,每个特性占一列。该特性处于 " ` urn:schemas-microsoft-com:xml-sql" ` 名称空间中。
608
609示例:
610
611
612 <xsd:element name="Order_x0020_Details" sql:field="Order Details" type="string"></xsd:element>
613
614
615对于平面数据,XML for Analysis 行集格式的样子如下例所示。列名称(特定于查询)在架构中定义为元素名称。各行由一对 <row> 标记包围起来:
616
617点击此出浏览
618
619对于层次结构数据(或嵌套行集),如由进行数据挖掘的 OLE DB 查询返回的数据,XML for Analysis 行集格式的样子如下例所示。行的结构没有改变,但数据特定的架构将定义包含嵌套数据的元素子类型。在此例中,嵌套元素是 ` <node_distribution> ` .
620
621点击此出浏览
622
623### String
624
625String **** 类型与标准 XML 字符串数据类型相对应。
626
627### UnsignedInt
628
629UnsignedInt 数据类型与 XML 无符号整数 **** 架构类型相对应。
630
631## XML for Analysis 行集
632
633**Discover** 方法的 _Result_ 参数中返回的信息的结构是根据本节中所详述的行集列布局确定的。
634
635以下行集中所述的所有列都是必需的,并且这些列必须按显示的顺序返回。但是,可以将其它列(不需要这些列的客户端应忽略它们)添加在末尾,对于不适用的信息,某些列可以包含空数据。
636
637以下各节将对各行集进行说明。各节都包含一个表,其中提供有关各列的以下信息。
638
639**列标题** | **内容**
640---|---
641列名称 | 输出行集中列的名称。
642类型 | 列的数据类型的说明。有关 XML for Analysis 支持的数据类型的详细信息,请参见 XML for Analysis 中使用的数据类型 。
643说明 | 列用途的简要说明。
644限制 | 表示是否可以用列来限制返回的行集(方法是通过包含 **Discover** 方法的 _Restrictions_ 参数)。“是”表示将列用作 _Restrictions_ 项来按此字段筛选结果。
645是否可以为空 | 表示是否必须返回数据或当列不适用时是否允许空字符串。“是”表示允许为空,并且数据是可选的。“否”则表示数据是必需的。
646
647
648
649### DISCOVER_DATASOURCES 行集
650
651当使用 _RequestType_ 参数中的 DISCOVER_DATASOURCES 枚举值调用 **Discover** 方法时,该方法将在 _Result_ 参数中返回 DISCOVER_DATASOURCES 行集。这种请求类型将从应用程序 Web 服务器的 URL 返回一个已发布数据源的列表(以一种实现特定的方式),使客户端可以选择要连接的数据源。
652
653<FONT face="宋体, Arial, Helvetica"
654---</node_distribution></row></value></statement></statement></statement></statement></value></members></member></tuple></tuples></members></crossproduct></union></members></crossproduct></member></members></crossproduct></axis></member></member></tuple></tuples></axis></store_x0020_sqft></store_x0020_sqft></default></cellinfo></hierarchyinfo></olapinfo></axesinfo></olapinfo></hierarchyinfo></axisinfo></axesinfo></olapinfo></statement>