Ako pridať do SSAS Tabularu vlastné funkcie

Dnes si ukážeme ultimátny hack, ktorý nenájdete nikde inde na internete. Keď totiž pracujete s SSAS Tabularom, tak jednou z nevýhod je to, že ho nemôžete rozširovať o vlastné funkcie. Aspoň nie oficiálne. Keďže to ale potreboval jeden z klientov pre svoj projekt, ktorý používal jazyk MDX, tak som sa rozhodol spraviť z nemožného možné. Tabular síce veľmi dlho protestoval, ale nakoniec zabrala jedna jednoduchá presvedčovacia metóda. A Vy si ju pravdepodobne ako prví na svete môžete vyskúšať.

Upozornenie: táto funkcionalita oficiálne nie je podporovaná Microsoftom, takže za prípadné škody nenesie autor ani tento portál žiadnu zodpovednosť. Použitie je len na vlastné riziko.

Najprv trocha teórie, aby ste vedeli, na základe čoho sa to podarilo. SSAS Tabular je jeden z módov inštalácie SQL Server Analysis Services. Oficiálne ide o úplne inú technológiu ako OLAP kocky, ktoré sú tiež implementované v Analysis Services. Po troche prieskumu na technologických fórach ale zistíte, že SSAS Tabular vznikol z OLAPov (čiže SSAS Multidimensional), vykuchaním OLAP storage enginu a formula enginu, a nahradením za storage engine a formula engine PowerPivotu. Starý formula engine (to je to, čo počíta zložité výrazy) však zostal takmer celý v Tabulare, a pravdepodobne funguje ako nadvrstva nad PowerPivotom. Vďaka tomu sa dá na Tabular dopytovať aj jazykom MDX, a nielen jazykom DAX. A jedným zo základných vlastností jazyka MDX v Analysis Services je to, že sa dá dopĺňať o vlastné funkcie, keď beží server v režime OLAPu. V režime Tabularu ale táto možnosť nie je, a nezafungujú ani predpripravené administrátorské skripty, ani prístup cez AMO API, pretože Microsoft to poctivo ošetril. Až na jednu výnimku – keď skúsite zavolať vlastné funkcie z knižníc dodávaných s každou inštaláciou OLAPu, tak to zafunguje aj voči Tabularu. Napr. tento príkaz by voči Tabularu vôbec nemal ísť, ale ide:

WITH MEMBER [x] AS VBAMDX!Round(1.2323, 2)
SELECT {[x]} ON COLUMNS
FROM [Model]

Microsoft to tam nechal pravdepodobne kvôli tomu, aby išlo prezerať dátový model aj z excelovských kontingenčiek, ktoré niektoré z týchto funkcií využívajú. A keďže poznám OLAPy ako svoje boty, tak mi to vnuklo myšlienku, že tadeto by mohla ísť cesta na hore uvedenú otázku. Všetky vlastné funkcie sú totižto v DLL súboroch v inštalačnom adresári Analysis Services. Zostávalo teda nájsť nejakú zo zbytočných knižníc, ktorú bežne nepoužívajú užívatelia pri dotazoch. Voľba padla na knižnicu VBAMDX, ktorá je uložená v súbore msmdvbanet.dll.

Najprv som si v C# pripravil vlastný DLL súbor, podľa pravidiel pre SSAS custom assemblies. Je to jednoduchá trieda s jednou statickou funkciou:

Postup výmeny bol nasledovný:

  1. Pripravil a skompiloval som si vlastnú DLLku s mojimi funkciami
  2. Zastavil som službu SSAS Tabular
  3. Spravil som si pre istotu záložnú kópiu súboru msmdvbanet.dll, aby sa to dalo dať do pôvodného stavu
  4. Nahradil som hore uvedený súbor msmdvbanet.dll svojím DLL súborom
  5. Spustil som službu SSAS Tabular

Tabular sa spustil, a fungoval bez problémov na bežné dotazy, a aj na kontingenčku z Excelu. Jedine treba vedieť to, že funkcie z Vášho DLL súboru sa budú v jazyku MDX javiť tak, že sú akože z knižnice VBAMDX. Takže ak napr. máte v DLLke funkciu s názvom testFunkcie, tak ju treba zavolať takto:

WITH MEMBER [x] AS VBAMDX!testFunkcie(1.234234)
SELECT {[x]} ON COLUMNS
FROM [Model]

Takže takto sa podarilo spraviť z nemožného možné, a dostať do Tabularu vlastné funkcie 🙂

Čo ak Vám ale budú chýbať funkcie z tej pôvodnej knižnice?

Žiaden problém – aspoň pre bežného programátora. V každom lepšom programovacom jazyku, Vaša knižnica môže importovať funkcie z inej DLL knižnice, čiže napr. aj z tej pôvodnej msmdvbanet.dll. Len ten pôvodný súbor musí mať iný názov, a musíte ho nechať v rovnakom adresári. Tým elegantne vyriešite aj túto otázku, keby ste naozaj potrebovali funkcie z tej pôvodnej knižnice. Väčšina z nich je ale už v knižnici VBA, takže to pravdepodobne nebude potrebné.

Odskúšané na verziách SQL Serveru 2012 – 2017. Funguje to na všetkých. A používatelia Tabularu môžu byť spokojní, že môžu dostať svoje projekty s Tabularom na ďalší level 🙂