在2005中使用DrillThrough函数
数据仓库、数据挖掘系统的显著优势之一是可以在分析的过程中对某个数据
DrillThrough to detail
。数据仓库较之普通数据库系统,对数据仓库的查询分析要比数据库快许多,这是因为数据仓库在
ETL
过程中已经对
Integrating
的数据源做了各种各样的预先统计处理,并增加了多倍的额外空间保存这些处理结果,才取得了对查询的快速反映优势。这也就是常说的“以空间换时间”。在
OLAP
分析的时候,也可以使用
DrillThrough
函数对数据源进行分析。
DrillThrough
函数是
MDX
常用函数之一,跟通常
MDX
执行
ExecuteCellSet
并返回
CellSet
对象不同的是,使用了
DrillThrough
关键字的
MDX
只能
ExecuteReader
返回
DataReader
。
1.
是否允许
DrillThrough
的权限设置集成在
role
的“管理角色”中。这点跟
AS2000
有比较大的区别。在
AS2000
中,仅对各个
cube
设置是否允许
DrillThrough
,所有
role
具有相同的是否允许
DrillThrough
的权限;在
AS2005
中设置更加明细,可以分别对各个
role
进行是否允许
DrillThrough
的设置。
2.
跟
AS2000
相同的是,
DrillThough
的对象依然是单个的
cell
。该
cell
可以是叶子水平的,也可以是基础度量的聚合
cell
。所以规定
Select
部分的每个
on axis
从句对应的
member
都是单一的。如:
DRILLTHROUGH
select
{[Measures].[Internet Sales Amount]}
on
Axis
(0),
{[Date].[Calendar].[Month].&[2004]&[3]}
on
Axis
(1),
{[Geography].[Geography].[Country].&[United States]}
on
Axis
(2),
{[Product].[Product Categories].[Subcategory].[Mountain Bikes]}
on
Axis
(3)
FROM
[Adventure Works]
或者
select从句为空,在where从句指定。上句跟如下语句是等效的:
DrillThrough select FROM
[Adventure Works]
WHERE
(
[Measures].[Internet Sales Amount],
[Date].[Calendar].[Month].&[2004]&[3],
[Geography].[Geography].[Country].&[United States]
,[Product].[Product Categories].[Subcategory].[Mountain Bikes]
)
)
3.
组成上述
cell
的各个维度都不允许有计算成员。没有做任何限制的维度默认都是
defaultMember
,如果该
defaultMember
含有计算成员,必须特别指定其他非计算成员。比如,度量维度的默认成员是计算成员,则必须在
select
或者
where
部分特别指定
measures
的成员([Measures].Members.Item(0))
。
4.
DrillThrough
跟维度的类型没有关系。如果
DrillThrough
的是父子关系的层次结构的父成员,则返回的结果将是所有组成该
cell
的行,包括子成员。
5.
AS2005
新增
Return
从句以限定返回的列。举个例子:
DrillThrough
select
(
[Measures].[Internet Sales Amount],
[Date].[Calendar].[Month].&[2004]&[3],
[Geography].[Geography].[Country].&[United States] ,
[Product].[Product Categories].[Subcategory].[Mountain Bikes]
)
on
0
from
[Adventure Works]
Return
[$Date].[Date],
KEY
([$Product].[Style]),
[Internet Sales].[Internet Sales Amount],
[Internet Sales].[Internet Tax Amount]
6. 在2000中,DrillThrough查询的是具体的数据库表,所以需要SqlConnection,而2005可以直接查询仓库系统,所以直接AdomdConnection
public
DataTable DrillThrough(
string
mdx,AdomdConnection adomdConn)
{
DataTable schema = new DataTable();
try
{
adomdConn.Open();
using (AdomdCommand command = new AdomdCommand(mdx, adomdConn))
{
using (AdomdDataReader reader = command.ExecuteReader())
{
//output the column information
DataTable schema = reader.GetSchemaTable();
foreach (DataRow row in schema.Rows)
{
dt.Columns.Add(row[0].ToString());
}
while (reader.Read())
{
DataRow dr = dt.NewRow();
for (int i = 0; i < reader.FieldCount; i++)
{
dr[i] = reader[i];
}
dt.Rows.Add(dr);
}
}
}
}
finally
{
adomdConn.Close();
}
return dt;
}