技术开发 频道

利用.NET扩展MDX存储过程

  【IT168 技术文档】SSAS的MDX脚本提供了强大的数据分析查询功能,然而在实际使用中同样会遇到一些问题使得用MDX来表达比较困难,因为MDX并不能提供满足年有数据分析需求的函数,这个时候可以尝试通过基于.NET的存储过程以编程的方式来完成我们特定的功能需求。基于.NET的MDX存储过程支持所有基于.NET平台的编程语言。可以通过创建一个包含所需功能的.NET程序集,然后将这个程序集加载到分析服务器或某个多维数据库中,最后就可以在MDX中引用这个.NET编写的存储过程了。  

CustomAnalysisAssembly
namespace CustomAnalysisAssembly
{
    
public class SPDemo
    {
        
public static double SalesDifference(double firstVal, double secondVal)
        {
            
return secondVal – firstVal;
        }
    }
}

  上面是用C#实现的一个简单Demo存储过程,用于处理两个值的差。上面使用的是一个静态函数来实现具体功能,而实际上静态函数并非唯一的选择,也可以使用非静态的方法。问题在于在MDX中引用非静态方法的时候,可能会造成服务器多次创建同一个对象,造成资源浪费。相反,如果使用静态函数,服务器就不会为其创建实例对象而是直接使用这个静态函数。所以在用.NET编写MDX存储过程的时候推荐使用静态方法实现。

  功能代码完成后进行编译,当把得到的程序集加载到分析服务器或多维数据库后就可以通过MDX来访问这个功能了。如下面的MDX代码就是引用.NET存储过程的方法: 

SELECT 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错误。

0
相关文章