Donnerstag, 28. Mai 2015

MDX Openquery > 8.000 Zeichen - ein Workaround !

Wer öfters Openquery in T-SQL nutzt ist bestimmt schon einmal an die Grenze von 8.000 Zeichen gekommen. Das es so was noch gibt *kopfschüttel*

Bei einer relationalen Abfrage ist das Problem ja relativ einfach behoben.

SELECT * FROM 
OPENQUERY(
LinkedServer, 
'SELECT ID="diese Abfrage im OPENQUERY wäre jetzt halt länger wie 8.000 Zeichen" FROM dbo.test'
)

wenn das fehlschlägt einfach ein 

DECLARE @sql VARCHAR(MAX) = ''


SET @sql = 'SELECT ID="diese Abfrage im OPENQUERY wäre jetzt halt länger wie 8.000 Zeichen" FROM dbo.test'

EXEC (@sql) AT [LinkedServer]

und gelöst ist das Problem. Das kleine AT nach dem EXEC mit dem LinkedServer ist der Trick. Nur mit EXEC und dem Code von oben in der Variablen würde es nicht funktionieren.

Jetzt habe ich aber ein MDX, das ich nicht nur abfragen sondern auch noch weiter verwenden möchte. In meinem Fall mach ich erst einen relationale Abfrage und möchte diese um multidimensionale Daten anreichern.

Also so was wie

SELECT Jahr, relationalerWert, multidimensionalerWert = NULL  FROM dbo.Beispiel

und jetzt Werte in die Spalte multidimensionalerWert bekommen. 

Ich habe das so gelöst - nicht schön - aber es funktioniert wenigstens. Und bitte immer annehmen das die LinkedServer Abfrage nicht so klein wie meine hier sind sondern richtig lang!

Ich baue mir das MDX

SELECT ({ Wert }) ON 0, ([Datum].[Jahr].MEMBERS) ON 1 FROM TestCube

dieses LANGE MDX packe ich in eine Variable 

DECLARE @mdx VARCHAR(MAX) = ''
SET @mdx = 'SELECT ({ Wert }) ON 0, ([Datum].[Jahr].MEMBERS) ON 1 FROM TestCube'

Dann wieder wie oben

EXEC (@mdx) AT LinkedServer

und ich bekomme Werte zurück

So was wie 

[Datum].UNIQUE_MEMBER, [Datum].MEMBER_CAPTION, [Wert]

Hilft noch nicht so viel

Jetzt baue ich mir eine temporäre Tabelle (oder Tbl. Variable)

CREATE TABLE #mdxResult (JahrID VARCHAR(500), JahrName VARCHAR(500), Wert VARCHAR(500))

und jetzt aus dem Exec in die Tabelle

INSERT INTO #mdxResult (JahrID, JahrName, Wert)
EXEC (@mdx) AT LinkedServer


Und jetzt habe ich die Daten aus der verdammt langen MDX OPENQUERY Abfrage in einer Tabelle und muss nur noch einen JOIN machen.

SELECT * FROM dbo.Beispiel AS relational 
LEFT JOIN #mdxResult AS mdx ON mdx.JahrName = relational.Jahr

Und - nicht schön! aber geht.

Hoffentlich hilft es jemandem. Ich würde mich über Kommentare freuen.
Oder kennst Ihr sogar noch einen besseren Weg?


Keine Kommentare: