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

Ssas 使用MDX是否可以使用条件脚本,ssas,mdx,Ssas,Mdx,在SQL中,可以使用以下结构 IF <condition> BEGIN <do something> END; 根据您想要实现的目标,在MDX中使用IF语句是完全可能的: 其他备选方案包括IIF(逻辑_表达式,表达式1,表达式2)和以下情况。。。然后。。。其他的END struct.我认为MDX主要是为了成为一种查询语言,因此SELECT语句是最先进的语句。还有一些其他的DML语句,如updatecube、DRILLTHROUGH、或CALL,但除了UPDA

SQL
中,可以使用以下结构

IF <condition>
BEGIN
    <do something> 
END;

根据您想要实现的目标,在MDX中使用IF语句是完全可能的:


其他备选方案包括IIF(逻辑_表达式,表达式1,表达式2)和以下情况。。。然后。。。其他的END struct.

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

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

DCL类似于
GRANT
REVOKE
的语句在MDX中不可用

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

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


事实上,MDX的用途比SQL限制得多,所以在某种程度上,它只是一个,对于某些目的来说非常好,但在它不打算用于的领域有很多弱点。

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


多维数据集计算脚本存储在服务器端SSAS中。您可以定义计算和其他一些逻辑。这些将可用于MDX查询。例如,您可以创建新成员和新集合。如果需要,还可以覆盖加载/计算的值。下面是一个关于它如何工作的简单解释

如果我用丹给出的例子。你甚至可以做像这样的事情

范围([Customer].[Customer Geography].[Country].成员); 范围([措施][互联网销售额]); 这个=10; 终端范围; 终端范围


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

+1感谢您提供的信息-也许可能,但仍然不确定-我已经用更具体的细节修改了OP。+1因为我对您的答案很感兴趣-尽管这个答案的一些扩展会非常好。你所说的“多维数据集计算脚本”是什么意思?多维数据集计算脚本存储在服务器端……它是负责处理多维数据集的脚本吗?在原始答案中添加了更多信息,因为我没有太多的评论。感谢参考-我需要与我们的多维数据集设计师/管理员交谈。
IF TheFollowingReturnsRow(
          select * 
          from   $SYSTEM.MDSCHEMA_SETS
          where  SET_NAME = 'Set_Custom' and 
                 CUBE_NAME = 'MyCube') THEN
      <do something>
END IF
SCOPE ([Customer].[Customer Geography].[Country].MEMBERS);
IF Measures.CurrentMember IS [Measures].[Internet Sales Amount] THEN this = 10 END IF;
END SCOPE;