WITH MEMBER [Measures].[Product Name] AS [Product].[Product].CurrentMember.Name MEMBER [Measures].[Product Unique Name] AS [Product].[Product].CurrentMember.UniqueName SELECT { [Measures].[Product Name], [Measures].[Product Unique Name] } ON 0 , {[Product].[Product].[Product].Members } ON 1 FROM [Adventure Works];
However, I cannot make the parameter as optional because of the limit, hence I need a member that represents NULL. For that, I need to introduce query-scoped calculated member and add it to the resultset;
WITH MEMBER [Measures].[Product Name] AS [Product].[Product].CurrentMember.Name MEMBER [Measures].[Product Unique Name] AS [Product].[Product].CurrentMember.UniqueName MEMBER [Product].[Product].[All Products].[(NULL)] AS Aggregate([Product].[Product].&[(NULL)]) SELECT { [Measures].[Product Name], [Measures].[Product Unique Name] } ON 0 , {[Product].[Product].[Product].AllMembers } ON 1 FROM [Adventure Works];
Now just like parameters loaded from SQL Server databases, I have a (NULL) item in the parameter for handling the situation. If you get an issue with sorting the result that MDX produces, alternative way for that is, executing the MDX using a TSQL Stored Procedure connecting to Analysis Services via a Linked Server object.
CREATE PROC dbo.GetProductsFromSSAS AS BEGIN DECLARE @Query nvarchar(max) SET @Query = N' SELECT "[Measures].[Product Name]" , "[Measures].[Product Unique Name]" FROM OpenQuery(OLAPDatabase, '' WITH MEMBER [Measures].[Product Name] AS [Product].[Product].CurrentMember.Name MEMBER [Measures].[Product Unique Name] AS [Product].[Product].CurrentMember.UniqueName MEMBER [Product].[Product].[All Products].[(NULL)] AS Aggregate([Product].[Product].&[(NULL)]) SELECT { [Measures].[Product Name], [Measures].[Product Unique Name] } ON 0 , {[Product].[Product].[Product].AllMembers } ON 1 FROM [Adventure Works]; '') ORDER BY 1;' EXEC SP_EXECUTESQL @Query; END GO