2

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
4

3 回答 3

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 结构。

于 2013-08-23T11:48:12.170 回答
2

我认为 MDX 主要旨在成为一种查询语言,因此该SELECT语句是最进化的语句。还有一些其他的DML语句,例如UPDATE CUBE, DRILLTHROUGH, or CALL,但除了 之外UPDATE,它们都只是读取数据,并且使用频率较低。

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

DCL语句与 MDX 类似GRANTREVOKE不可用。

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

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

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

于 2013-08-23T19:37:16.517 回答
1

如果可能的话,我建议将所有这些条件逻辑移到立方体计算脚本中。可以使用更有效的范围语句。

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

如果我使用丹给出的例子。你甚至可以做类似的事情

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

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

于 2013-08-26T11:08:26.883 回答