我从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)")
}
)
答案 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] } }
希望有所帮助。