代码改变世界

利用.NET扩展MDX存储过程

2009-05-26 21:17  Yin.P  阅读(1754)  评论(2编辑  收藏  举报

  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存储过程的方法:  

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