Введення в SQL Server Analysis Services для розробника. Параметризрвані MDX-запити, Інші СУБД, Бази даних, статті

Дивно, але іноді на семінарах виявляється, що народ щиро вважає, ніби в MDX-Запит на відміну від SQL не можна передати параметри. Я думаю, це помилка відбувається швидше за все від того, що в SQL Server Management Studio в редакторі Analysis Services MDX Query немає можливості поставити параметризований запит. Синтаксис MDX підтримує параметри в запиті, а чому їх не спромоглися пристосувати в SSMS – Питання до тих, хто її писав. Параметри можна передати, написавши класичний XMLA. Якщо замість Analysis Services MDX Query відкрити в SSMS Analysis Services XMLA Query і зобразити щось навроде

<Execute xmlns=”urn:schemas-microsoft-com:xml-analysis”>

  <Command>

    <Statement>

      select [Measures].members on 0,

      Filter(Customer.[Customer Geography].Country.members,

      Customer.[Customer Geography].CurrentMember.Name = @CountryName) on 1

      from [Adventure Works]

    </Statement>

  </Command>

  <Properties>

    <PropertyList>

      <Catalog>Adventure Works DW 2008R2</Catalog>

    </PropertyList>

  </Properties>

  <Parameters>

    <Parameter>

      <Name>CountryName</Name>

      <Value>“United Kingdom”</Value>

    </Parameter>

  </Parameters>

</Execute>

Скрипт 1


можна бачити, що параметризрвані запити прекрасно працюють (див. Рис.1). Ще виникає здивування, що б в синтаксисі XMLA було не зробити однотипними елементи і ? Наприклад, замість

<Properties>

    <PropertyList>

      <Catalog>Adventure Works DW 2008R2</Catalog>

    </PropertyList>

  </Properties>

зробити, як у параметрів:

<Properties>

    <Property>

      <Name> Catalog</Name>

      <Value> Adventure Works DW 2008R2</Value>     

    </Property>

  </Properties>


чи навпаки? Не знаю, Моше видніше.

Рис.1

На жаль, редактор XMLA в SSMS відображає результат запиту в його первинному вигляді XML і не дозволяє його відобразити у вигляді наочного набору осередків, як це вміє робити редактор MDX Query:

Рис.2

Рівно так само параметризрвані запит можна виконати з програми. Програмно заслати в AS довільний XMLA-запит можна, наприклад, засобами SOAP, як розглядалося в одному з попередніх постів.  В ADOMD.NET, як ми пам’ятаємо, В AdomdCommand можна засунути тільки начинку елемента Command. Елементи Properties і Parameters в XMLA-запиті знаходяться на одному рівні з елементом Command і в його InnerXml не потрапляють. Для їх передачі використовуються колекції Properties і Parameters класу AdomdCommand:

using System.Data;

using System.IO;

using System.Xml;

using System.Diagnostics;

using Microsoft.AnalysisServices.AdomdClient;

class Program

{

    static void Main(string[] args)

    {

        AdomdConnection cnn = new AdomdConnection(@”Data Source=http://192.168.0.29/msolap/msmdpump.dll; User ID=192.168.0.29Administrator;Password=cth%tyflf”);

        cnn.Open();

        AdomdCommand cmd = new AdomdCommand(

          @”select [Measures].members on 0,

    Filter(Customer.[Customer Geography].Country.members,

           Customer.[Customer Geography].CurrentMember.Name = @CountryName) on 1

    from [Adventure Works]”, cnn);

        cmd.Properties.Add(“Catalog”, “Adventure Works DW 2008R2”);

        cmd.Parameters.Add(new AdomdParameter(“CountryName”, “United Kingdom”));

        CellSet res = cmd.ExecuteCellSet();

        for (int i = 0; i < res.Axes[0].Positions.Count; i++)

        {

            Debug.WriteLine(“”);

            for (int j = 0; j < res.Axes[1].Positions.Count; j++)

                Debug.Write(res.Cells[i, j].FormattedValue);

        }

        cnn.Close();

    }

}

Скрипт 2

В даному випадку назва бази перейшло з елемента Catalog батьківського елемента PropertyList батьківського елемента Properties

<Properties>

    <PropertyList>

      <Catalog>Adventure Works DW 2008R2</Catalog>

    </PropertyList>

  </Properties>

(Скрипт 1) в член колекції cmd.Properties [“Catalog”] – см.Скріпт 2, а параметр запиту – з елемента  

<Parameters>

    <Parameter>

      <Name>CountryName</Name>

      <Value>”United Kingdom”</Value>

    </Parameter>

  </Parameters>

(Скрипт 1) в член колекції cmd.Parameters [“CountryName”]. Можна подивитися на результат і переконатися, що він співпадає з рис.2 з точністю до форматування.

Рис.3

У даному прикладі, як і раніше використовується доступ до Analysis Services по HTTP. Якщо справа відбувається в межах одного домену, то, як зазначалося в одному з попередніх постів, Можна замінити рядок з’єднання на “Data Source = 192.168.0.29”. Тоді б SOAP йшов безпосередньо по ТСР.

Виникає питання, невже верхнеуровневость ADOMD.NET в порівнянні з SOAP не дозволить виконати з неї повноцінний XMLA просто як він є? Без того, щоб попередньо сепарувати його на команду, властивості, параметри і т.д. і розпихати це господарство з різних об’єктах ADOMD.NET. Дивіться наступну серію.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*