您的位置:首页 > 数据库

AMO olap Test C# generate tsql and mdx

2013-11-30 19:32 225 查看
通过AMO访问online的cube,生成等值的TSql和mdx

自动生成等值的TSQL和MDX进行Cube测试.其中难度比较大的部分是拼接TSQL.

暂时不处理calculations,只除理metrics和Regular Type的dimension Usage.

metric的聚合方法只处理(max,min,sum,count,distinct count)

以下是问题的记录与处理情况.

1.adventureworks示例cube中,会把Date dimension的attributes的表名取成dimtime. 未解决 已经解决此问题

2.如果dimension 表中的attributes引用了其他表的字段,则暂时没有解决这个问题. 解决

使用TableJoin和TableLinks方法来解决这个问题.

Tablelinks方法获取dimensionattributes中使用到的字段所在的表与主表的关系链.

Tablejoin:生成连接的语句.

或许不完善.

3.新问题 如果hierarchy的level的source attribute用的是calculation,那么现在仍然会报错,我应该判断

这个字段是不是计算成员,如果是计算成员,则要去取计算成员的定义.

http://technet.microsoft.com/en-us/library/ms345093.aspx

4.没有考虑dimension attribute的orderby 属性与name column. 未解决(尽快解决 已经解决此问题)

5.问题 自连接的情况 如果dimension usage 当中事实表和维度表是一个表的话,需要给表加别名.

现在只考虑事实表与维度表相同的情况,其他的暂时不考虑.

6.在某些情况下,sum出来的结果会发生溢出,所以需要提前把它转化为bigint.

可以在判断其列的类型为int时自动将其转化成bigint. 未解决

7.遇到父子dimension会形成死循环,或者类似存在回链关系的DSV维度,忽略掉. 解决:第二次出现的时候直接断开.

以下是生成等值TSQL与MDX的运行情况,使用Adventurework示例数据仓库SSAS进行测试,除了提到的第一个问题外,

生成的TSQL均可以运行.

public string GetSourceQueryDefinition(Dimension dim,string keycolsrc)
{
//获取dim的dsv 获取
string rst=keycolsrc;
DataSet ds = dim.DataSourceView.Schema;
string tbname = keycolsrc.Replace("dbo.","");
if(ds.Tables.Contains(tbname))
{
if(ds.Tables[tbname].ExtendedProperties.Contains("QueryDefinition"))
rst = "("+ds.Tables[tbname].ExtendedProperties["QueryDefinition"].ToString() + ") as "+ tbname;
}

return rst;
}
public string GetColumnDefinition(DataSet ds, string columndatasource)
{
string columnDefinition = "";
string tableName = columndatasource.Split('.')[0];
string columnName = columndatasource.Split('.')[1];
if (ds.Tables.Contains(tableName)
&& ds.Tables[tableName].Columns.Contains(columnName)
&& ds.Tables[tableName].Columns[columnName].ExtendedProperties.Contains("ComputedColumnExpression")
)
{
columnDefinition = "(" + ds.Tables[tableName].Columns[columnName].ExtendedProperties["ComputedColumnExpression"].ToString() +")";
}
else
{
columnDefinition = columndatasource.ReplaceFirstUnderLineWithDot().AppendComma();
}
return columnDefinition;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: