Ssas 如何检查MDX表达式的类型?

Ssas 如何检查MDX表达式的类型?,ssas,mdx,olap,Ssas,Mdx,Olap,我正在创建一些工具来动态生成MDX查询。在我生成的查询的一部分中,我需要检查表达式是成员表达式还是元组表达式,并对其应用不同的逻辑。有人知道我如何在运行时通过使用MDX检查MDX表达式类型吗 要知道MDX表达式的确切类型,您必须编写MDX解析器(至少对于可能出现的表达式) 有一些规则:类似于(x,y)的东西可能是一个元组;所有返回元组的方法(如strotuple、Root或Item,后者仅在应用于集合时)的结果都是元组,所有返回成员的方法(如祖先或默认成员,但如果应用于元组,也包括Item)的结

我正在创建一些工具来动态生成MDX查询。在我生成的查询的一部分中,我需要检查表达式是成员表达式还是元组表达式,并对其应用不同的逻辑。有人知道我如何在运行时通过使用MDX检查MDX表达式类型吗

要知道MDX表达式的确切类型,您必须编写MDX解析器(至少对于可能出现的表达式)

有一些规则:类似于
(x,y)
的东西可能是一个元组;所有返回元组的方法(如
strotuple
Root
Item
,后者仅在应用于集合时)的结果都是元组,所有返回成员的方法(如
祖先
默认成员
,但如果应用于元组,也包括
Item
)的结果都是成员。有关按类型分类的功能列表,请参见。但是您已经看到了
Item
方法的困难,该方法可以根据上下文传递元组或成员

我不认为您可以轻松编写测试类型的MDX语句,因为AnalysisServices使用自动类型转换,在上下文需要时将成员转换为元组

从我的观点来看,最好的方法是使用允许同时使用成员和元组的语法,并避免必须知道类型

一种不需要显式检查数据类型,但只检查某些构造是否有效的方法是使用VBA函数
IsError
,如下所示:

IIf(IsError(x.Level, <something avoiding the Level function>, <use x.Level>) 
IIf(iError(x.Level,)

你所说的类型是什么意思?成员是一个元组;也许你应该简要说明一下,一旦你得到了“类型”,你想做什么。@MarcPolizzi“成员是一个元组”不正确。正确的是,在许多地方,Analysis Services允许您在需要元组的地方随意使用成员,并进行隐式类型转换。@FrankPl是的,有些函数只适用于成员,而不适用于元组。@FrankPI:同意您的看法,但可以应用于成员而不是元组的逻辑是什么le(反之亦然)-这与MDX表达式位于同一位置?@MarcPolizzi,例如
.Name
等属性以及
.Lag()等函数
只能应用于成员,而不能应用于元组,并且会导致错误,至少如果您有“多维元组”,即至少包含两个层次结构中的成员的多维元组。我同意另一种情况,将使用元组的方法应用于成员是通过自动类型转换处理的。@FrankPI感谢您的回答。i h一些表达式检查行或列上是否有多个级别,但有时用户可能在行/列中有元组,这是一个问题。并且使用的一些函数不适用于元组(例如,链接中的级别)。这就是我想知道表达式类型的原因。从您的回答来看,我必须让生成器了解更多有关传入内容的信息。我想这就是我现在必须做的事情,以解决此问题。@bigbearzhu我在回答的末尾添加了另一种方法。但不知道您的确切问题,我不确定它是否正确不管有没有帮助。@FrankPI对我来说似乎是一个可能的解决办法!我会试试的。非常感谢。