MDX没有将我的表达式识别为元组集?

时间:2011-09-20 16:14:20

标签: ssas 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]

它解释我的表达是什么,如果不是作为一个元组集?我一直偶然发现这些事情,而且它对于我的元组集试图做什么感到非常困惑,因为它认为它是字符串或数字表达式。

2 个答案:

答案 0 :(得分:3)

这确实令人困惑,因为看起来两个查询之间没有太大区别。此问题在博文中有所描述:http://www.softwaremasons.com/MartinsBlog/tabid/74/EntryId/56/Is-SSAS-Too-Lenient-on-MDX-Syntax.aspx

如果用CrossJoin函数替换第一个*运算符,您会发现查询执行正常。

*只是一个CrossJoin以不同的方式编写 - 所以如果它以单向工作,而另一方面失败 - 我们可以假设问题在于Analysis Services引擎如何解析*运算符。当您添加CrossJoin函数时,您将显式返回一个集合,然后将其与*一起使用以与度量交叉连接,一切都很好。在您的工作示例中,您已使用大括号显式标识了一个集合,从而为引擎提供了继续查询所需的内容 - 但是当您尝试将*与两个成员一起使用时,它将失败。从技术上讲,每个成员都是一个一个,它应该工作,但引擎不会以这种方式解析查询并失败。

上面的博客文章表示问题是MDX的宽大处理。它允许我们在没有强烈输入结果的情况下离开(即排除{}以将成员键入为集合)。我自己称之为虫子。 :)如果语言让我们在一个地方松散,那么它应该在其他地方保持一致。

答案 1 :(得分:2)

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

来自MSDN - Members, Tuples and Sets

  

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

对于错误消息,当您看到带有额外空格的“函数”时,它指的是您的查询中没有应用函数的格式错误的集合或元组(因此没有函数名称放在错误信息)。

例如,如果您编写了EXCEPT([A].[B].[C], [D].[E].[F])之类的查询,其中一个参数无效,则会收到包含“函数EXCEPT ...”的错误。但是如果你只有一个定义不明确的集合或元组,你会得到两个空格的“函数”。这似乎是MSAS的错误报告!