在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
答案 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 CUBE
,DRILLTHROUGH
或CALL
,但UPDATE
除外,它们都只是读取数据,而且是使用频率较低。
然后,有一些 DDL 命令,但这些命令仅限于对现有多维数据集或当前查询会话的轻微调整,您无法使用MDX创建新的多维数据集或维度。用于创建多维数据集或更改维度等的SSAS的“真实DDL命令”是XMLA命令,而不是MDX语句。
MDX中不提供GRANT
或REVOKE
等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; 结束范围; 结束范围;
如果情况非常缓慢,但经过这样的转换后,它们应该以合理的速度工作。