Ssas 在MDX中参数化非对称集?
我从2005年升级到了SQLServer2008R2,现在这个查询已经不起作用了(尽管我不排除是我做的事情导致的)。我简化了名称/查询,以说明问题: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]
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的方法。