Ssas 在MDX中参数化非对称集?

Ssas 在MDX中参数化非对称集?,ssas,mdx,Ssas,Mdx,我从2005年升级到了SQLServer2008R2,现在这个查询已经不起作用了(尽管我不排除是我做的事情导致的)。我简化了名称/查询,以说明问题: SELECT NON EMPTY { [BizDim].[County].[County] * [BizDim].[name].[name] } ON COLUMNS, { [Biz Line Type Dimension].[Line Number].[Line Number]

我从2005年升级到了SQLServer2008R2,现在这个查询已经不起作用了(尽管我不排除是我做的事情导致的)。我简化了名称/查询,以说明问题:

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参数使用一个Tuple表达式。使用了元组集表达式

我可以删除stroset函数,它可以完美地工作:

  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)  
  )
我尝试了strotuple并得到了相同的错误

我可以动态地构建查询,但我宁愿避免这种风险,特别是考虑到它在使用参数之前运行良好

所以问题是,如何让这个不对称集在SQLServer2008R2 SSAS中再次用作参数

更新: 请注意,这将通过替换所有成员的键来消除错误,但实际上不会过滤任何内容,因此只需表明我的语法似乎并不坏:

  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)}    
  )
我确实设法让它以一种不那么动态的方式工作,但相当烦人。基本上,我的过滤器需要划分为许多不同的参数,因为我需要为每个参数调用stroset:

  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)")
    }    
  )

[评论后编辑]

  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)表示法的歧义,表示元组或括号运算符;e、 ({},{})是交叉连接

可能需要显式包装到集合中:

{ [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] } }

希望这能有所帮助。

对不起,我更新了一个非等距集用途的解释。使用速记以便更容易地查看模式
{(Corp.All,Local.All,HQ.Yes),(Corp.Yes,Local.All,HQ.All)}
。这基本上是说给我那些在总部是或公司是的地方。这是一种跨不同列模拟逻辑OR的方法。