Asd

Thursday, March 1, 2012

SQL+MDX in one Apartment (Hybrid Query).

While replying on the MSDN Forums Most of the time people ask on how to write SQL+MDX both in single place means.
1-      Certain data like aggregated data from MDX Query.
2-      Select that data from SQL Query and get these data in table to show on reports.
I already answer couple of the question on forums but then think it’s better to write blog on above topics.

Some for the forum post I Included here for reference.
1-      SSRS combining MDX and T-SQL.
3-      MDX Named Set and OPENQUERY.

How to Create SQL+MDX-

Basically to write SQL+MDX combined we have to create link server from where we want data to combine with SQL. To create link server you need to have Admin access to the SQL Server.

IF IS_SRVROLEMEMBER ('sysadmin') = 1
   print 'Current user''s login is a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') = 0
   print 'Current user''s login is NOT a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') IS NULL
   print 'ERROR: The server role specified is not valid.'

Above Query returns the whether you have admin admittance to the server or not to create Link Server.

Suppose we have access to the Link server now to get data from created linked server we use another function named as OPENQUERY – Basically OpenQuery function Executes the specified pass-through query on the specified linked server. This server is an OLE DB data source. OPENQUERY can be referenced in the FROM clause of a query as if it were a table name. OPENQUERY can also be referenced as the target table of an INSERT, UPDATE, or DELETE statement. This is subject to the capabilities of the OLE DB provider. Although the query may return multiple result sets, OPENQUERY returns only the first one.

More Details on Hybrid Query-

USE
AdventureWorksDW2008R2
GO
EXEC
sp_addlinkedserver
@server='Test',
@srvproduct='',
@provider='MSOLAP',
@datasrc='localhost',
@catalog='Adventure Works DW 2008R2'

Declare @MDXExpression as Varchar(MAX)
Select @MDXExpression =
'
SELECT
NON EMPTY
      {
      [Measures].[Sales Amount]
      ,[Measures].[Standard Product Cost]
      ,[Measures].[Tax Amount]
      ,[Measures].[Total Product Cost]
      } ON 0,
NON EMPTY
      {
      [Sales Channel].[Sales Channel].[Sales Channel]
      } ON 1
FROM
      [Adventure Works]
';     
Exec ('SELECT * INTO ##TestTemp FROM OpenQuery(TestTest1,''' + @MDXExpression + ''')')
SELECT
      CONVERT(varchar,t."[Sales Channel].[Sales Channel].[Sales Channel].[MEMBER_CAPTION]") AS [Date],
      (CONVERT(nvarchar,t."[Measures].[Sales Amount]")) AS [Sales Amount],
      (CONVERT(nvarchar,t."[Measures].[Standard Product Cost]")) AS [Standard Product Cost],
      (CONVERT(nvarchar,t."[Measures].[Tax Amount]")) AS [Tax Amount],
      (CONVERT(nvarchar,t."[Measures].[Total Product Cost]")) AS [Total Product Cost]
from
      ##TestTemp t

--DRop Table ##TestTemp

Query Wxecution-

1-      So above query first creates liked server with named as 'Test'.
2-      After that MDX query executed on linked server where we have kept the MDX query in MDXExpression variable.
3-      Using OpenQuery function data gets dump in to ##TestTemp table.
4-      Finally we get the data from ##TestTemp table.


SUHAS R. KUDEKAR (MCTS - Microsoft Business Intelligence)
Learning Office 2010 + SharePoint 2010 + SQL Server 2008 R2

1 comment: