Запросы многомерных выражений для служб Notification Services

Результирующий набор запросов многомерных выражений может иметь несколько измерений. Однако данный поставщик событий требует, чтобы запросы многомерных выражений возвращали плоский набор строк, который, в свою очередь, может пересылаться в виде набора событий приложению служб Notification Services.

Запрос многомерных выражений должен возвращать результирующий набор со столбцами, соответствующими полям класса событий. Первый столбец результата многомерного выражения должен соответствовать первому полю класса событий; второй столбец результата многомерного выражения должен соответствовать второму полю класса событий и так далее.

Запросы многомерных выражений для поставщика событий Analysis Services могут быть статическими. Статические запросы означают, что весь запрос известен при создании приложения. Или они могут быть динамическими. Динамические запросы означают, что элементы оси ROWS или элементы среза запроса многомерных выражений получаются путем выполнения запросов на языке Transact-SQL. Результаты запросов на языке Transact-SQL используются для формирования окончательного запроса многомерных выражений с использованием преобразования XSL.

Статические запросы многомерных выражений

Если известен точный запрос, необходимый для получения данных для приложения служб Notification Services, то можно создать статический запрос. Службы Notification Services запустят этот точный запрос в соответствии с тактовым расписанием, заданным в определении приложения.

Рассмотрим следующее определение класса событий:

<EventClass>
    <EventClassName>KPIEvents</EventClassName>
    <Schema>
        <Field>
            <FieldName>Employee</FieldName>
            <FieldType>varchar(100)</FieldType>
        </Field>
        <Field>
            <FieldName>ProfitMargin</FieldName>
            <FieldType>varchar(10)</FieldType>
        </Field>
        <Field>
            <FieldName>OrderQuantity</FieldName>
            <FieldType>int</FieldType>
        </Field>
        <Field>
            <FieldName>SalesAmount</FieldName>
            <FieldType>money</FieldType>
        </Field>
    </Schema>
</EventClass>

Ниже приведен пример статического запроса многомерных выражений, возвращающего результат, соответствующий данному классу событий:

SELECT
      {[Measures].[Reseller Gross Profit Margin], 
      [Measures].[Reseller Order Quantity], 
      [Measures].[Reseller Sales Amount]} ON COLUMNS,
      {[Employee].[Employees].[Ken J. Snchez], 
      [Employee].[Employees].[Amy E. Alberts]} ON ROWS
FROM [Adventure Works] 
WHERE [Date].[Calendar].[CY 2002]

Этот запрос выбирает три меры из куба Adventure Works. Эти меры представляют собой столбцы в результирующем наборе. Запрос далее ограничивается выбором строк, относящихся только к двум сотрудникам: Кену Дж. Санчесу (Ken J. Sánchez) и Эми Е. Альбертс (Amy E. Alberts).

В измерении Время заказа есть несколько кортежей. Поэтому запрос далее ограничивает, или «срезает», запрос для отображения только 2002 года.

Окончательный результирующий набор представляет собой таблицу, которая показывает коэффициент валовой прибыли посредников (Reseller Gross Profit Margin), количество заказов через торгового посредника (Reseller Order Quantity) и объем товарооборота посредников (Reseller Sales Amount) для выбранных сотрудников за 2002 год.

  Reseller Gross Profit Margin Reseller Order Quantity Reseller Sales Amount

Ken J. Sánchez

1,34%

58 241

24 144 429,65р.

Amy E. Alberts

4,68%

10 546

3 457 549,94р.

Когда службы Notification Services запускают этот запрос, двумерный результирующий набор пересылается в виде пакета событий классу событий.

Динамические запросы многомерных выражений

Для приложения служб Notification Services может потребоваться выбрать только данные для сотрудников, подписанных на приложение. Однако в связи с тем, что сотрудники могут добавлять и удалять подписки, при построении приложения невозможно иметь фиксированный список для статического запроса.

Можно создать статический запрос, который возвращает запись для каждого сотрудника, независимо от того, является он подписчиком или нет. Однако если в кубе содержатся десятки тысяч сотрудников, то статический запрос возвратит строку для каждого из них. В результате получится большой пакет событий, содержащий ненужные данные.

Можно существенно повысить производительности приложения, создав динамический запрос многомерных выражений. Рассмотрим класс подписки со следующей схемой:

<SubscriptionClass>
    <SubscriptionClassName>KPISubscriptions</SubscriptionClassName>
    <Schema>
        <Field>
            <FieldName>DeviceName</FieldName>
            <FieldType>nvarchar(255)</FieldType>
            <FieldTypeMods>NOT NULL</FieldTypeMods>
        </Field>
        <Field>
            <FieldName>SubscriberLocale</FieldName>
            <FieldType>nvarchar(10)</FieldType>
            <FieldTypeMods>NOT NULL</FieldTypeMods>
        </Field>
        <Field>
            <FieldName>EmployeeFullName</FieldName>
            <FieldType>varchar(100)</FieldType>
        </Field>
        <Field>
            <FieldName>ProfitMargin</FieldName>
            <FieldType>varchar(10)</FieldType>
        </Field>
    </Schema>
    ...
</SubscriptionClass>

Вначале создается запрос на языке Transact-SQL, выбирающий список интересующих элементов, например сотрудников:

SELECT EmployeeFullName as Employee
FROM NSKPISubscriptionsView

В этом запросе предполагается, что первая буква отчества включается с именем.

Поставщик событий служб Analysis Services получает результат этого запроса на языке Transact-SQL в виде XML, где каждое выбранное имя столбца возвращается в качестве атрибута элемента строки:

<rows>
    <row Employee="Ken J. Snchez" />
    <row Employee="Amy E. Alberts" />
    <row Employee="Terry Lee Duffy" />
    <row Employee="Brian S. Welcker" />
</rows>

Затем создается преобразование XSL, форматирующее список результатов в полный запрос многомерных выражений. Например, преобразование может записать известные части запроса в match="rows". Затем для каждой строки преобразовать значение в элемент в спецификации ON ROWS запроса многомерных выражений. Для преобразования XML-кода используется следующее преобразование XSL:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="rows">
SELECT 
    { [Measures].[Total Product Cost], 
       KPIValue([Gross Profit Margin]), 
       KPIGoal([Gross Profit Margin]), 
       KPIStatus([Gross Profit Margin]), 
       KPITrend([Gross Profit Margin]) } ON COLUMNS,
    { <xsl:apply-templates select="row"/> } ON ROWS
FROM [Adventure Works] 
WHERE [Date].[Calendar Time].[2002]
</xsl:template>
<xsl:template match="row"> 
    <xsl:apply-templates select="@Employee" />
    <xsl:if test="not(position()=last())">,
    </xsl:if> 
</xsl:template>
<xsl:template match="@Employee">[Employee].[Employees].[<xsl:value-of select="."/>]</xsl:template>
</xsl:stylesheet>

Результатом этого преобразования будет полный запрос многомерных выражений:

SELECT
      {[Measures].[Reseller Gross Profit Margin], 
      [Measures].[Reseller Order Quantity], 
      [Measures].[Reseller Sales Amount]} ON COLUMNS,
    { [Employee].[Employees].[Ken J. Snchez],
       [Employee].[Employees].[Amy E. Alberts],
       [Employee].[Employees].[Brian S. Welcker] } ON ROWS
FROM [Adventure Works] 
WHERE [Date].[Calendar].[CY 2002]

Поставщик событий служб Analysis Services использует этот запрос, формируемый динамически при каждом запуске поставщика событий, для отправки запросов о данных события в куб.

В этом преобразовании XSL срез [Date].[Calendar].[CY 2002] содержится в коде преобразования. Запрос на языке Transact-SQL может быть передан поставщику событий служб Analysis Services с использованием аргумента SlicerQuery для динамического создания предложения WHERE.

Результаты запроса строк и запроса среза комбинируются в единый результат XML:

<rows>
    <row Employee="Ken J. Snchez" />
    <row Employee="Amy E. Alberts" />
    <row Employee="Brian S. Welcker" />
</rows>
<slicers>
    <slicer Calendar="CY 2002"/>
</slicers>

Преобразование XSL применяется к XML для формирования динамического запроса многомерных выражений.

См. также

Основные понятия

Определение поставщика событий служб Analysis Services

Другие ресурсы

Поставщик событий служб Analysis Services
Определение поставщиков событий
Стандартные поставщики событий
Ключевые понятия многомерных выражений (многомерные выражения)

Справка и поддержка

Получение помощи по SQL Server 2005