日期:2014-04-03  浏览次数:20426 次

SQL Server 2000 Analysis Services 支持许多用于 OLAP 的新的结构功能、安全功能和管理功能选项 — 包括链接的多维数据集、计算的单元、命名集和分布式分区的多维数据集。Analysis Services 还包含一些用于开发人员的新功能,例如,通过钻取浏览明细数据行的功能,以及允许用户通过使用操作来作用于多维数据集内的单元的功能。在这两种情况下,这些特性所提供的功能在过去即使能够实现,那么在实现时也是非常困难的。Russ Whitney 在 Mastering OLAP 专栏的 "Analysis Services Drillthrough"(2000 年 6 月发表,InstantDoc ID 85301)一文和 "Analysis Services Actions"(2000 年 7 月发表,InstantDoc ID 8758)一文中,讨论了如何将这些功能用于 ADO MD。在本文中,我将说明开发人员如何通过添加钻取支持和实现操作,来利用用于 Web 应用程序的 Analysis Services。采集我?y0xXWue

实现钻取采集我?y0xXWue

在 Microsoft 发布了 SQL Server 7.0 OLAP 服务后,用户使用最频繁的功能就是检索用于计算特定单元的值的基础数据的功能。举例来说,如果您需要知道某个单元包括哪些客户或哪些产品,该功能就显得非常有用。就其本质而言,OLAP 在实现聚合事实数据表的行的功能(这是它的关键优势)的同时也对明细数据行进行了抽象化,并因此使明细数据行的查找变得很困难。在发布 Analysis Services 之前,面临这种挑战的开发人员不得不在多维数据集成员和关系数据库之间实现元数据映射层(它包含星型架构或雪花型架构)。访问单元时,代码既要读取多维数据集成员信息,又要读取应用于查询的任何筛选器。然后,代码必须生成 SQL 查询,以便联接关系数据库中的多个表、执行查询并返回结果集。编写可正确地以这种方式访问单元的代码并不轻松。但有了 Analysis Services 以后,您根本就无需编写或维护这种代码。采集我?y0xXWue

Analysis Services 包含了用来实现钻取的代码;第 38 页的图 1 显示了 Analysis Services 如何完成钻取的高级视图。客户端应用程序执行从本地透视表服务传递到 OLAP 服务器的 MDX 语句。请记住,透视表服务是 OLE DB 提供程序,它提供缓存、本地多维数据表处理以及到 Analysis (OLAP) 服务器的连接。然后,OLAP 服务器使用多维数据集中的配置选项和安全设置来创建 SQL 语句,并将它发送到保存明细数据的关系数据库。SQL 语句再通过 OLAP 服务器和透视表服务将返回的 OLE DB 行集发回到客户端应用程序。通常,客户端通过 ADO Recordset 对象访问数据。采集我?y0xXWue

要实现钻取功能,您必须既要执行管理任务,又要执行应用程序特定的任务。从管理员的角度来说,第一个任务是启用多维数据集的钻取功能。管理员控制多维数据集钻取功能的启用是至关重要的,因为单元常常包含来自数千行甚至数百万行的数据,因此让所有用户不受限制地查询此数据可能导致网络瓶颈。要对多维数据集启用钻取功能,请启动“多维数据集编辑器”,然后依次选择“工具”和“钻取选项”。在得到的“多维数据集钻取选项”对话框中,只需选中“启用钻取”复选框,如图 2 所示。Analysis Services 支持常规多维数据集、虚拟多维数据集或链接多维数据集的钻取,但 Analysis Services 不允许您对某类单元使用钻取,这类单元具有基于计算的成员单元或自定义成员公式的值。采集我?y0xXWue

请注意,在图 2 所示的情况中,您必须启用钻取,并且要使列的列表包含来自架构中的事实数据表和维数表的所有列。在此示例中,多维数据集的名称是 Enrollment,利用该多维数据集,可以针对 Quilogy 技术培训课程中的学生注册情况生成报表。根据您在该对话框中所选择的列,Analysis Services 会在查询基础数据时联接适当的表。图 2 中的对话框还包含“筛选”选项卡,该选项卡可包含用于限制结果集中的行数的 WHERE 子句。但是,由钻取动态生成的 WHERE 子句除外。采集我?y0xXWue

除了以多维数据集级别启用钻取,您还可以对包含一个以上分区的多维数据集中的每个分区的选项进行修改。您可以通过在“磁盘分区向导”(要访问“磁盘分区向导”,请右击某个分区,然后从上下文菜单中选择“编辑”)中单击“高级设置”按钮和“钻取选项”来访问与图 2 中的对话框相类似的对话框。您可以在显示的“分区钻取选项”对话框中,更改从该分区创建钻取数据时所要使用的列和筛选器。可对各个分区设置钻取选项的功能意味着,如果您对聚合一个以上分区中数据的单元执行钻取操作,每个分区将返回其自己的结果集,而且那些结果集中的列可以互不相同。应用程序开发人员需要意识到这一行为,这样他们就可以根据需要来显示结果。管理员的下一个任务是配置钻取安全设置,为此,您需要使用“多维数据集角色管理器”对话框,针对您要向其授予访问权限的角色单击“钻取”设置。每个角色都有一个名为“允许钻取”的安全设置,您可以选择该设置,以便允许角色执行使用钻取操作的查询。采集我?y0xXWue

用于开发人员的钻取采集我?y0xXWue

当您启用钻取并配置安全设置之后,即可为应用程序实现钻取。为了说明实现钻取所需的步骤,我向 Active Server Pages (ASP) 页面添加了钻取功能,该页面基于随 Analysis Services 提供的 ASPADOComplex.ASP 页面。此页面执行一个显示 Quilogy 地点、在每个地点登记的学生天数和收入金额的查询(当然数据都是虚构的),如图 3 所示。采集我?y0xXWue

在基于 Web 的应用程序中,在 UI 中提供钻取支持的最自然的方式是将超级链接放在单元上,以便允许用户单击该链接来显示明细数据。请注意,图 3 中的每个单元都包含一个超级链接。要生成超级链接,可以修改下面的语句,以便包括或更换可输出单元值的 ASPADOComplex.ASP 代码:采集我?y0xXWue

Response.Write " <a



href=../../Drillthrough.ASP?



colName=" & _



colName(k) & "&rowName="



& rowName(j) & _



"&cube=Enrollment&Where=" &



Server.URLEncode(strWhere) & ">" _



& cst(k, j).FormattedValue & "</a>"



请注意,超级链接调用 Drillthrough.ASP 页面,通过查询字符串向该页面传递当前列和行成员名称、多维数据集以及 MDX 语句为生成单元集而所使用的任何 WHERE 子句。ASPADOComplex.ASP 页面中的代码在 ASP 页面中创建表行和列标头时,将行名和列名作为填充的数组进行存储。下面的代码从 MDX 语句提取 WHERE 子句,然后将值发送到 Drillthrough.ASP 页面,清单 1显示了该页面。采集我?y0xXWue

intPos = Instr(Session("M