条件脚本是否可以使用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

根据您想要实现的目标,在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。。。然后。。。其他。。。END结构。

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

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

DCLGRANTREVOKE这样的语句在MDX中不可用。

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

对于存储过程,Analysis Services依赖于COM(已弃用)和.net,在这两种情况下,您可以使用完整的过程功能,并且只使其对象模型可用于.net或COM。无论如何,存储过程支持仅限于返回一个对象的函数(可能与包含大量数据的MDX集一样复杂),或返回结果集的过程。后者不能与其他MDX语句交互,只能使用CALL procname(parameters)调用。对于批处理,MDX只依赖于调用批处理的宿主环境来执行所有条件分支和循环。

事实上,MDX的使用比SQL受限得多,因此在某种程度上,它只是一种"特定领域的语言",在某些用途上非常好,但在不适用的领域有很多弱点。

如果可能的话,我建议将所有这些条件逻辑转移到多维数据集计算脚本中。在那里,可以使用更高效的范围语句。

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

如果我用丹的例子。你甚至可以做之类的事情

范围(【客户】、【客户地域】、【国家】、会员);范围(【措施】、【互联网销售额】);这=10;末端范围;末端范围;

如果条件很慢,但经过这样的转换,它们应该以合理的速度工作。

相关内容

最新更新