SSAS的MDX脚本提供了强大的数据分析查询功能,然而在实际使用中同样会遇到一些问题使得用MDX来表达比较困难,因为MDX并不能提供满足所有数据分析需求的函数,这个时候可以尝试通过基于.NET的存储过程以编程的方式来完成我们特定的功能需求。基于.NET的MDX存储过程支持所有基于.NET平台的编程语言。可以通过创建一个包含所需功能的.NET程序集,然后将这个程序集加载到分析服务器或某个多维数据库中,最后就可以在MDX中引用这个.NET编写的存储过程了。
CustomAnalysisAssemblynamespace CustomAnalysisAssembly
{
public class SPDemo
{
public static double SalesDifference(double firstVal, double secondVal)
{
return secondVal – firstVal;
}
}
}
上面是用C#实现的一个简单Demo存储过程,用于处理两个值的差。上面使用的是一个静态函数来实现具体功能,而实际上静态函数并非唯一的选择,也可以使用非静态的方法。问题在于在MDX中引用非静态方法的时候,可能会造成服务器多次创建同一个对象,造成资源浪费。相反,如果使用静态函数,服务器就不会为其创建实例对象而是直接使用这个静态函数。所以在用.NET编写MDX存储过程的时候推荐使用静态方法实现。
功能代码完成后进行编译,当把得到的程序集加载到分析服务器或多维数据库后就可以通过MDX来访问这个功能了。如下面的MDX代码就是引用.NET存储过程的方法:
CodeSELECT MEMBER [Date].[Diff] AS
CustomAnalysisAssembly.SPDemo.SalesDifference(
[Date].[YMD].[Year].&[2009],
[Date].[YMD].[Year].&[2008]
)
SELECT [Date].[Diff] ON COLUMNS
FROM [AWCube]
WHERE [Measures].[Internet Sales Amount]
在引用的时候要注意方法的参数类型,要与方法声明相匹配。在这里这个方法接收的是两个double类型的数据,如果将集合、层次或级别等其它非double的数据类型传递给.NET存储过程会导致MDX错误。
来源:https://www.cnblogs.com/SmartBizSoft/archive/2009/05/26/1490397.html