使用MDX是否可以使用条件脚本

时间:2013-08-23 11:36:21

标签: ssas mdx

SQL中,可以使用以下结构

IF <condition>
BEGIN
    <do something> 
END;

我可以在MDX范围内以类似的方式使用条件吗?


修改
具体来说,我想以某种方式测试一个集是否存在,并将其用作IF语句中的条件。

IF TheFollowingReturnsRow(
          select * 
          from   $SYSTEM.MDSCHEMA_SETS
          where  SET_NAME = 'Set_Custom' and 
                 CUBE_NAME = 'MyCube') THEN
      <do something>
END IF

3 个答案:

答案 0 :(得分:2)

根据您想要实现的目标,绝对可以在MDX中使用IF语句:

http://technet.microsoft.com/en-us/library/ms145517.aspx

SCOPE ([Customer].[Customer Geography].[Country].MEMBERS);
IF Measures.CurrentMember IS [Measures].[Internet Sales Amount] THEN this = 10 END IF;
END SCOPE;

其他替代方案包括IIF(Logical_Expression,Expression1,Expression2)和CASE WHEN ...... THEN ... ELSE ... END struct。

答案 1 :(得分:2)

我认为MDX主要用于查询语言,因此SELECT语句是最进化的语句。还有一些其他 DML 语句,例如UPDATE CUBEDRILLTHROUGHCALL,但UPDATE除外,它们都只是读取数据,而且是使用频率较低。

然后,有一些 DDL 命令,但这些命令仅限于对现有多维数据集或当前查询会话的轻微调整,您无法使用MDX创建新的多维数据集或维度。用于创建多维数据集或更改维度等的SSAS的“真实DDL命令”是XMLA命令,而不是MDX语句。

MDX中不提供GRANTREVOKE

DCL 语句。

对于在SQL中找到的第四类语句,过程语句if语句(与if表达式相对)或循环结构,以及作为服务器端游标,MDX也不提供任何支持。这些语句是SQL的一部分,在Oracle,SQL Server,DB2,mySQL等不同的DBMS之间不是很标准化,而基本的DML和DDL或多或少是标准化的 - 在某种程度上所有主要的关系数据库支持ANSI SQL。即使对于关系数据库,这通常是后来的附加组件,主要用于存储过程,触发器(作为过程的特殊情况)和批处理。 MySQL被广泛使用多年而没有支持这些仅在版本5中引入的语句。

对于存储过程,Analysis Services依赖于COM(不建议使用)和.net,您可以在其中使用完整的过程特性,并使其对象模型可用于.net或COM。无论如何,存储过程支持仅限于返回一个对象的函数(可能与包含大量数据的MDX集一样复杂),或者返回结果集的过程。后者无法与其他MDX语句交互,只能使用CALL procname(parameters)进行调用。对于批处理,MDX只依赖于调用批处理来进行所有条件分支和循环的托管环境。

事实上,MDX的使用限制比SQL要严格得多,所以在某种程度上,它只是一个"domain specific language",对于某些目的来说非常好,但在它不具备的领域有许多弱点打算用于。

答案 2 :(得分:1)

如果可能的话,我建议将所有这些条件逻辑移动到立方体计算脚本。 在那里可以使用效率更高的范围说明。

多维数据集计算脚本存储在服务器端SSAS中。您可以定义计算和其他一些逻辑。这些将可用于MDX查询。例如,您可以创建新成员以及新集。如果需要,还可以覆盖加载/计算的值。以下是有关其工作原理的简单说明http://www.sqlservergeeks.com/blogs/AmitK/sql-server-bi/65/implementing-calculations-in-ssas-using-mdx-part1

如果我使用Dan给出的例子。你甚至可以做像

这样的事情

SCOPE([客户]。[客户地理]。[国家] .MEMBERS);     范围([措施]。[互联网销售额]);         这= 10;     结束范围; 结束范围;

如果情况非常缓慢,但经过这样的转换后,它们应该以合理的速度工作。