可以在服务器上或客户端应用程序上调用存储过程。 在任一情况下,存储过程始终在服务器上运行,即服务器或数据库的上下文。 执行存储过程不需要特殊权限。 将存储过程添加到服务器或数据库上下文后,只要用户的角色允许存储过程执行的作,任何用户都可以执行存储过程。
在 MDX 中调用存储过程的方式与调用内部 MDX 函数的方式相同。 对于不带参数的存储过程,将使用过程名称和空括号对,如下所示:
MyStoredProcedure()
如果存储过程采用一个或多个参数,则按顺序提供参数,用逗号分隔。 以下示例演示了一个包含三个参数的示例存储过程:
MyStoredProcedure("Parameter1", 2, 800)
在 MDX 查询中调用存储过程
在所有 MDX 查询中,存储过程必须返回 MDX 表达式所需的语法正确类型。 如果存储过程未返回正确的类型,则会发生 MDX 错误。 以下示例演示返回集、成员和数学运算结果的存储过程。
返回集
以下示例实现一个名为 MySproc 的存储过程,该存储过程返回集。 在第一个示例中,MySproc 直接在 SELECT 表达式中返回集。 在第二个两个示例中,MySproc 将设置作为 Crossjoin 和 DrilldownLevel 函数的参数返回。
SELECT MySetProcedure(a,b,c) ON 0 FROM Sales
SELECT Crossjoin(MySetProcedure(a,b,c)) ON 0 FROM Sales
SELECT DrilldownLevel(MySetProcedure(a,b,c)) ON 0 FROM Sales
返回成员
以下示例显示了返回成员的 MySproc 函数:
SELECT Descendants(MySproc(a,b,c),3) ON 0 FROM Sales
返回数学运算的结果
SELECT Country.Members on 0, MySproc(Measures.Sales) ON 1 FROM Sales
使用 Call 语句调用存储过程
可以使用 MDX Call 语句在 MDX 查询的上下文之外调用存储过程。
可以使用此方法实例化存储查询的副作用,或应用程序获取存储查询的结果。 语句的 Call 常见用途是使用分析管理对象(AMO)来执行没有返回结果的管理功能。 例如,以下命令调用存储过程:
Call MyStoredProcedure(a,b,c)
语句中从存储过程返回的唯一 Call 支持类型是行集。 行集的序列化由 XML for Analysis 定义。 如果语句中的 Call 存储过程返回任何其他类型,则忽略该存储过程,并且不会在 XML 中返回给调用应用程序。 有关 ANALYSIS 行集的 XML 的详细信息,请参阅 XML for Analysis Schema Rowset。
如果存储过程返回 .NET 行集,Analysis Services 会将服务器上的结果转换为 Analysis 行集的 XML。 分析行集的 XML 始终由函数中的 Call 存储过程返回。 如果数据集包含不能在 XML 中表示 Analysis 行集的功能,则失败结果。
返回 void 值的过程(例如 Visual Basic 中的子例程)也可以与 CALL 关键字一起使用。 例如,如果要在 MDX 语句中使用函数 MyVoidFunction(),则采用以下语法:
CALL(MyVoidFunction)