替换查询字符串中的MDX参数

时间:2015-07-30 21:01:24

标签: c# .net mdx olap-cube query-parameters

我是MDX查询新手,无法正确使用adomd参数。我正在使用的查询字符串如下:

Select {
    [Measures].[Unit On Order], 
    [Measures].[Cost On Order], 
    [Measures].[Retail On Order] 
} on columns, 
NON EMPTY 
{ 
    [Product].[Universal Customer Choice Code].&[@GlobalId] 
} 
* 
{ 
    [Date].[01 - Fiscal Week].[@StartFiscalWeek] : [Date].[01 - Fiscal Week].[@EndFiscalWeek] 
} on rows 
from [Buy Plan] 
where ( 
    [Brand].[Brand].[@Brand], 
    [Market].[Market].[@Market], 
    [Reporting Currency].[Reporting Currency].&[@ReportingCurrency]
    )

我一直在添加参数:

 var parameter = command.CreateParameter();
 parameter.ParameterName = argument.Key;
 parameter.Value = argument.Value;
 command.Parameters.Add(parameter);

当我手动替换@parameters时,结果具有值。但是,我无法使用Adomd参数执行相同操作。我见过有人建议使用StrToSet()和StrToMember()。我既不熟悉,也无法弄清楚Set和Member之间的区别。

我认为我需要的只是知道如何正确格式化QueryString。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

由于评论很长,请将其添加为答案。

  

但是,我确实还有一些问题。为什么参数   和StrToMember要求使用整个字段?为什么我不能   使查询字符串看起来像:

StrToMember

很难解释原因,那只是语法!你不能在这样的声明中使用StrToMember("[Product].[Universal Customer Choice Code].[" + @GlobalId + "]")

构建查询的另一种方法是:

@GlobalID

看看这里发生了什么?

您的报告中传递的member是字符串值。您可以将此值连接到静态字符串,并将其转换为格式正确的成员定义。下一步是使用StrToMember函数将此字符串转换为StrToMember

请注意,如果您打算将来添加更多成员,那么StrToSet功能将不再有效。您必须使用constructor

希望它有所帮助。

答案 1 :(得分:0)

天啊,我想通了!对于那些知道如何使用MDX但也许对其他人有用的人来说,这可能是一个简单的答案。

我的第一个问题:我的参数格式不正确。

 var param_wrong = new AdomdParameter("@Global", 012345);

这是不正确的,因为' @'不应该包含在参数声明中,只能在Query字符串中。

 var param_almost_correct = new AdomdParameter("Global", 012345);

我的第二个问题:我的初始查询字符串没有包括StrToMember。我终于想出了如何使用它。 StrToMember应该包括整个字段。现在参数应该反映这一点。

 var param_correct = new AdomdParameter("Global", [Product].[Universal Customer Choice Code].[000113416000]);

第三个问题和最后的改变是创建一个格式正确的查询字符串,如下所示。

   Select { 
   [Measures].[Unit On Order], 
   [Measures].[Cost On Order], 
   [Measures].[Retail On Order] } 
   on columns, 
   NON EMPTY {  
      StrToMember(@GlobalId) } * 
     { StrToMember(@StartFiscalWeek) : StrToMember(@EndFiscalWeek) } 
   on rows from [Buy Plan] 
   where( 
      StrToMember(@Brand), 
      StrToMember(@Market), 
      StrToMember(@ReportingCurrency) ) 

但是,我确实还有一些问题。为什么参数和StrToMember要求使用整个字段?为什么我的查询字符串看起来不像:

 [Product].[Universal Customer Choice Code].[StrToMember(@GlobalId)]

我试过这样但是没有用。