在 MDX 中生成命名集 (MDX)

集表达式可能是长而复杂并因此很难理解的声明。或者,可能非常频繁地使用集表达式,以致于重复定义集成为一种负担。为了使长而复杂的表达式或常用的表达式更易于使用,多维表达式 (MDX) 允许定义“命名集”表达式。

从根本上说,命名集就是指定了别名的集表达式。命名集可包含能正常合并到集中的任何成员或函数。由于 MDX 将命名集别名视为集表达式,因此您可以在任何能使用集表达式的位置使用命名集别名。

可以将命名集定义为具有下列上下文之一:

  • 查询作用域:若要创建一个命名集,该命名集被定义为 MDX 查询的一部分并且其作用域因此被限制在该查询内,请使用 WITH 关键字。然后,就可以在 MDX SELECT 语句中使用该命名集。通过这种方法,更改用 WITH 关键字创建的命名集时就不会打乱 SELECT 语句。

    有关如何使用 WITH 关键字创建命名集的详细信息,请参阅创建查询作用域的命名集 (MDX)

  • 会话作用域:若要创建一个命名集,使其作用域比查询上下文更广(即,其作用域为 MDX 会话的生存期),请使用 CREATE SET 语句。使用 CREATE SET 语句定义的命名集对该会话中的所有 MDX 查询均可用。例如,CREATE SET 语句对于需要在多种查询中大量重用某个集的客户端应用程序会非常有用。

    有关如何使用 CREATE SET 语句在会话中创建命名集的详细信息,请参阅创建会话作用域的命名集 (MDX)

  • 全局作用域   若要创建一个命名集,使其作用域比用户会话的上下文更广(即,其作用域是运行实例的生存期),请在默认 MDX 脚本内使用 CREATE SET 语句。有关详细信息,请参阅基本 MDX 脚本 (MDX)。在默认 MDX 脚本内使用 CREATE SET 定义的命名集可供所有用户在其任意会话的所有 MDX 查询内使用。

命名集的内容可以在创建时刻计算(静态),也可以在查询中使用它们时计算(动态)。CREATE SET [STATIC|DYNAMIC] 语法定义何时计算集;有关详细信息,请参阅 CREATE SET 语句 (MDX)CREATE SET 语句 (MDX)。默认情况下,如果未在创建语句中指定任何一个关键字,则将集创建为 STATIC。

可以全局方式(在默认 MDX 脚本中)定义具有动态行为的命名集,也可以在会话的作用域中定义具有动态行为的命名集。但是,仅当解析查询时才计算这些命名集(查询作用域)。任何在会话作用域或全局作用域内计算动态集的尝试都将引发错误;这同样适用于动态集的间接引用。下面是可以引用动态命名集的计算列表,这些计算或者是以全局方式定义的,或者是在会话作用域中定义的。

  • 计算成员

  • 动态命名集

  • KPI

  • 赋值表达式的右侧 (RHS) 表达式

  • 单元计算的条件表达式

  • 单元计算的值表达式

在任何 MDX 查询内,都可能引用动态集,因为动态集将在查询作用域内计算。

注意事项注意

因为动态集不在 CREATE SET 命令期间计算,所以会创建一个指向动态集所依赖的全部对象的链接(静态或动态)。因此,在删除动态集之前,不能删除任何引用对象或所有引用对象。例如,如果在引用某个会话计算成员的会话上创建了一个动态命名集,则在该动态命名集仍然存在时,不能删除该计算成员。

动态命名集解析

任何时刻,最多可以存在三个版本的动态集:

  • 多维数据集脚本中使用的全局作用域中的动态集

  • 会话计算中使用的会话作用域中的动态集

  • 查询计算中使用的查询作用域中的动态集

在计算中使用哪个版本,完全取决于表达式的上下文以及动态命名集的引用方式;这在大多数情况下也适用于间接引用。

例如,如果您有一个使用会话动态命名集的会话计算成员,并且您在查询中使用该计算成员,则将在会话作用域中计算该命名集,并且查询的 WHERE 字句不会对该命名集产生影响。但是,如果您直接在查询中使用该动态命名集,则将在查询作用域中计算该命名集,并且 WHERE 子句可能会影响该命名集的结果。