通过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均可以运行.

AMO olap Test C# generate tsql and mdx

   

界面介绍:填入OLAP CUBE的连接字符串,选择DB,CUBE与dimensions.直接点击生成mdxtsql.

以下贴一些主要的方法(代码)

AMO olap Test C# generate tsql and mdx

由于dimension可能引用多个表,所以要把这几个表关联起来,有了以下代码:   

   private string TableJoin(DimensionAttribute da)
        {
            //根据l找到sourcetable
            //然后去匹配tablelinks中的长度 然后再去获取
            string morejoin = "";
            string tablelinks = GetTableLinks(da.Parent);
            if (tablelinks.Split(',').Length<3) return "";
            string TableName = da.KeyColumns[0].Source.ToString().Split('.')[0]+",";
            if (tablelinks.IndexOf(TableName).Equals(0)) return "";
            string strUsedTables = tablelinks.Substring(0, tablelinks.IndexOf(TableName)-1);
            List<string> usedTables = strUsedTables.Split(',').ToList<string>();
            usedTables.Remove("");

            DataSet ds = da.Parent.DataSourceView.Schema;
            for (int i = 0; i < ds.Relations.Count && usedTables.Count > 0; i++)
            {
                string childTable = usedTables[0];
                DataRelation dr = ds.Relations[i];
                if (dr.ChildTable.TableName.Equals(childTable))
                {
                    morejoin = morejoin.Append(" JOIN " 
                         + GetSourceQueryDefinition(da.Parent,dr.ParentTable.TableName.ReplaceFirstUnderLineWithDot())
                        ).AppendNewLine().Append("ON ");
                    for (int j = 0; j < dr.ChildColumns.Length; j++)
                    {
                        morejoin = morejoin.Append(
                            dr.ParentTable.TableName.ReplaceFirstUnderLineWithDot()+"." + dr.ParentColumns[j].ColumnName + " = " +
                            dr.ChildTable.TableName.ReplaceFirstUnderLineWithDot() +"." + dr.ChildColumns[j].ColumnName
                            ).AppendNewLine();
                    }
                    usedTables.RemoveAt(0);
                    i = 0;
                }
            }

            return morejoin;
        }
        private string GetTableLinks(Dimension dim)
        {
            HashSet<string> tables = new HashSet<string>();
            string  MainTable =  "";
            string  tablelinks = string.Empty;
            DataSet ds = dim.DataSourceView.Schema;
            MainTable= dim.KeyAttribute.KeyColumns[0].Source.ToString().Split('.')[0];
            tablelinks = tablelinks.Append(MainTable+",");
            for (int i = 0; i < ds.Relations.Count; i++ )
            {
                DataRelation dr = ds.Relations[i];
                if (dr.ChildTable.TableName.Equals(MainTable))
                {
                    tablelinks = tablelinks.Append(dr.ParentTable.TableName + ",");
                    MainTable = dr.ParentTable.TableName;
                    if (tables.Contains(MainTable))
                        break;
                    else
                        tables.Add(MainTable);
                    i = 0;
                }
            }
            return tablelinks;
        }
View Code

相关文章:

  • 2021-12-17
  • 2021-12-07
  • 2021-09-08
  • 2021-10-09
  • 2022-01-02
  • 2021-11-21
  • 2021-06-07
  • 2021-07-25
猜你喜欢
  • 2021-07-12
  • 2022-12-23
  • 2021-10-22
  • 2022-12-23
  • 2021-10-07
  • 2022-12-23
相关资源
相似解决方案