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