Announcing the Analysis Services Stored Procedure Project

    General discussion

  • A few months ago, a few community-spririted Analysis Services guys (including me) got together to create some example Analysis Services stored procedures. I'm happy to announce that beta 1 of our project is now available to download here:
    The idea was to create a set of useful extensions to MDX to help solve common problems and at the same time provide some example source code to help people writing their own stored procedures. Please take a look and tell us what you think!


    Monday, August 14, 2006 6:40 AM

All replies

  • Very Nice!

    How about a function that takes care of divide-by-zero and returns NULL if the denominator is 0? Ie. ReturnDivide(division). That would clean up a lot of iif mdx.


    Monday, August 14, 2006 3:46 PM
  • We discussed this exact problem, but Mosha explained that using a sproc in this way would do more harm than good. Basically, the problem is that there's no way of marking a sproc as being deterministic (ie will always return the same result for the same cell) and so that means that if you use a sproc in a calculated member then the value returned by that calculation will never be cached. As a result, it's probably better to use IIF instead so that subsequent requests for the result returned by a calculation for any given cell in the cube will be returned from the cache.

    To answer your other question about IIF, if <mdxstatement> is a calculated measure whose result can be cached, then no, it will only be executed once and the second time it's evaluated the value will be returned from the cache. So it's good idea to create a calculated measure to hold the value of <mdxstatement> even if you don't intend to display the result to the user and set its Visible property to False.



    Monday, August 14, 2006 8:53 PM
  • Just so I understand:
    You are saying that the following MDX script will make the server calculate [measures].[summation] once in the scope iif statement:

    Create Member [Measures].[Summation] AS

    Aggregate({[DimMember1], [DimMember2]});

    Scope ([DimMemberX]);

    this = iif([Measures].[Summation] = 0, NULL, [SomeSet] / [Mesures].[Summation];

    End Scope;

    Whereas this statement will make it calculate it twice:

    Scope ([DimMemberX]);

    this = iif(aggregate({[Dimmember1], [Dimmember2]}) = 0, NULL, [Someset] / aggregate([DimMember1], [DimMember2]));

    End Scope;


    Tuesday, August 15, 2006 5:21 AM
  • Yes, that's what I understand.


    Tuesday, August 15, 2006 7:32 AM