0

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

本质上,这是一个逻辑或,如果列 Corp == 'x' OR HQ == 'x' 然后将其包含在结果中。这被称为非对称(原文如此)集。

上面给出了错误: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)")
    }    
  )
4

1 回答 1

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) 表示法有歧义,该表示法是元组或括号运算符;例如, ( {}, {} ) 是一个交叉连接。

也许您需要显式包装到 set :

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

希望有帮助。

于 2012-05-20T23:19:44.523 回答