MDX不能识别我的表达式为元组集



当我有两个使用&[Value]语法交叉连接的成员引用时,我会得到这个错误:

Query(3,3)函数期望参数1的元组集合表达式。使用了字符串或数字表达式。

注意,The function中有两个空格,好像它试图命名一个没有名称的函数。我可以用"Adventure Works DW 2008R2"样本数据库重新创建这个问题。

不工作:

SELECT
  NON EMPTY
  {
     [Date].[Day of Month].&[1]
    * [Sales Territory].[Sales Territory Country].&[Canada]
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

:

SELECT
  NON EMPTY
  {
     [Date].[Day of Month].&[1]
    * {([Sales Territory].[Sales Territory Country].&[Canada])}
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

同样适用:

SELECT
  NON EMPTY
  {
     {([Date].[Day of Month].&[1])}
    * [Sales Territory].[Sales Territory Country].&[Canada]
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

同样适用:

SELECT
  NON EMPTY
  {
     [Date].[Day of Month].&[1]        
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

同样适用:

SELECT
  NON EMPTY
  {
     [Sales Territory].[Sales Territory Country].&[Canada]    
    * [Measures].[Sales Amount]
  }
  ON COLUMNS,  
  NON EMPTY
  {
    [Product].[Product Name]   
  }
  ON ROWS
  FROM [Adventure Works]

如果不是元组集合,它将我的表达式解释为什么?我一直在纠结这些事情,这真的很令人困惑,因为它试图对我的元组集做什么,它认为这是一个字符串或数字表达式

这确实令人困惑,因为这两个查询之间似乎没有太大区别。这里有一篇博客文章描述了这个问题:http://www.softwaremasons.com/MartinsBlog/tabid/74/EntryId/56/Is-SSAS-Too-Lenient-on-MDX-Syntax.aspx

如果将第一个*操作符替换为CrossJoin函数,您将发现查询执行得很好。

*只是以不同的方式编写的CrossJoin—因此,如果它以一种方式工作,而另一种方式失败—我们可以假设问题出在Analysis Services引擎如何解析*操作符。在添加CrossJoin函数时,将显式返回一个集合,然后使用*与度量进行交叉连接,一切正常。在您的工作示例中,您通过使用大括号显式地标识了一个集合,从而为引擎提供了继续查询所需的内容-但是当您尝试对两个成员使用*时,它会失败。从技术上讲,每个成员都是一组成员,它应该可以工作,但是引擎没有以这种方式解析查询,因此失败了。

当上面的博客文章说问题是MDX的宽容时,它是善意的。它使我们不必对结果进行强类型输入(即排除{}来将成员键入为集合)。我自己会称它为bug。:)如果语言允许我们在一个地方松散,那么它应该在其他地方保持一致。

表达式是一个单元组集合(即一个元组是多维数据集中一个特定成员的集合)。这(令人困惑)与元组集合不同。

From MSDN - member, Tuples and Sets

由单个元组组成的集合不是元组;它们被MDX解释为集合。某些MDX函数接受元组作为参数,如果传递单个元组集,则会引发错误。元组和单元组集合不能互换。

至于错误消息,当你看到带有额外空格的"函数"时,它指的是查询中没有应用函数的畸形集或元组(因此没有函数名称可以放入错误消息中)。

例如,如果您编写了一个像EXCEPT([A].[B].[C], [D].[E].[F])这样的查询,并且其中一个参数无效,您将得到一个包含"The function EXCEPT…"的错误。但是如果你有一个定义不好的集合或元组,你会得到带有两个空格的"The function"。这似乎是MSAS糟糕的错误报告!

最新更新