在MDX中参数化非对称集?

时间:2012-05-20 22:28:03

标签: ssas mdx

我从2005年升级到SQL Server 2008 R2,现在这个查询不再有效(虽然我不排除我做的事情)。我简化了名称/查询以证明问题:

SELECT
  NON EMPTY
  {
        [BizDim].[County].[County]
      * [BizDim].[name].[name]
  }
  ON COLUMNS,
  {
        [Biz Line Type Dimension].[Line Number].[Line Number]
      * [Biz Line Type Dimension].[Display Name].[Display Name]
  }
  ON ROWS
  FROM [TPS Data View]
  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,STRTOSET("{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]),([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}")    
  )

基本上这是一个符合逻辑的OR,如果列Corp =='x'或HQ =='x',则将其包含在结果中。这被称为非对称(sic)集。

以上给出了错误: Tuple函数需要3参数的元组表达式。使用了元组集表达式。

我可以删除STRTOSET功能,它可以完美运行:

  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]),([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}    
  )

然而,这并不好,因为实际的查询是参数化的,所以它必须与STRTO *函数一起使用:

  Where (
    STRTOSET(@Counties, CONSTRAINED)  
    ,STRTOSET(@BizTypes)  
  )

我尝试过STRTOTUPLE并得到同样的错误。

我可以动态地构建查询,但我宁愿避免冒这个风险,特别是考虑到它在使用参数之前工作正常。

所以问题是,如何让这个非对称集在SQL Server 2008 R2 SSAS中再次作为参数工作?

更新: 请注意,这可以通过替换ALLMEMBERS键来消除错误,但实际上并没有过滤任何东西,所以它只是为了显示我的语法似乎并不坏:

  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS),([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}    
  )

我确实设法以不那么动态的方式使用它,但非常烦人。基本上我的过滤器需要分成许多不同的参数,因为我需要为每个参数调用一个STRTOSET:

  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,{
       STRTOSET("([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x])")
      ,STRTOSET"([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)")
    }    
  )

1 个答案:

答案 0 :(得分:0)

[评论后编辑]

  Where 
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    * STRTOSET("{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]),([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}")  

它们可能是(x,y,z)表示法的歧义,它是元组或括号运算符;例如,({},{})是交叉连接。

也许您需要明确包装到集合中:

{ [BizDim].[HQ].[HQ].&[x] }

或替换:

([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]) 

带有明确的交叉连接:

{ [BizDim].[Corp].[Corp].ALLMEMBERS * [BizDim].[Local].[Local].ALLMEMBERS * { [BizDim].[HQ].[HQ].&[x] } }

希望有所帮助。