Consultas MDX para Notification Services
El conjunto de resultados de una consulta de expresiones multidimensionales (MDX) puede tener varias dimensiones. Sin embargo, este proveedor de eventos requiere que sus consultas MDX devuelvan un conjunto de filas plano, que, a su vez, se pueda enviar como un conjunto de eventos a una aplicación de .
La consulta MDX debe devolver un conjunto de resultados con columnas asignadas a los campos de clase de evento. La primera columna del resultado MDX se debería asignar al primer campo de clase de evento, la segunda se debería asignar al segundo campo de clase de evento y así sucesivamente.
Las consultas MDX para el proveedor de eventos de Analysis Services pueden ser estáticas. Por estática se entiende que se conoce la consulta completa cuando se crea la aplicación. Las consultas MDX también pueden ser dinámicas. Por dinámica se entiende que los elementos del eje ROWS o los elementos del segmentador de consultas MDX se obtienen al ejecutar las consultas Transact-SQL. Los resultados de las consultas Transact-SQL se utilizan para generar la consulta MDX final mediante una transformación XSL.
Consultas MDX estáticas
Cuando conozca la consulta exacta necesaria para obtener datos de la aplicación de , puede escribir una consulta estática. Notification Services ejecutará esta consulta exacta según la programación de cuantos especificada en la definición de la aplicación.
Tenga en cuenta la siguiente definición de clase de evento:
<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>
A continuación se muestra un ejemplo de una consulta MDX estática que devuelve un resultado apropiado que se asigna a esta clase de evento:
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]
Esta consulta selecciona tres medidas del cubo Adventure Works. Estas medidas son las columnas del conjunto de resultados. La consulta se restringe aún más seleccionando las filas que sólo pertenecen a dos empleados: Ken J. Sánchez y Amy E. Alberts.
En la dimensión Order Time existen varias tuplas. Por lo tanto, la consulta se restringe aún más o se "segmenta" para mostrar únicamente el año 2002.
El conjunto de resultados final que se devuelve es una tabla que muestra los valores Reseller Gross Profit Margin, Reseller Order Quantity y Reseller Sales Amount para los empleados seleccionados del año 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 |
Cuando ejecuta esta consulta, el conjunto de resultados bidimensional se envía como un lote de eventos a una clase de evento.
Consultas MDX dinámicas
En una aplicación de , es posible que sólo desee seleccionar datos de empleados suscritos a la aplicación. Sin embargo, dado que los empleados pueden agregar y eliminar suscripciones, no se obtendrá una lista fija para una consulta estática al crear la aplicación.
Puede escribir una consulta estática que devuelva un registro para cada empleado, tanto si está suscrito como si no. Sin embargo, si un cubo tiene decenas de miles de empleados, una consulta estática devolverá una fila por empleado. Eso constituye un lote de eventos grande que contiene datos irrelevantes.
Puede mejorar el rendimiento de la aplicación de forma significativa si escribe una consulta MDX dinámica. Considere una clase de suscripción que utilice el esquema siguiente:
<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>
Primero, escriba una consulta que seleccione una lista de elementos de interés, como empleados:
SELECT EmployeeFullName as Employee
FROM NSKPISubscriptionsView
Esta consulta supone que la inicial central está incluida en el nombre.
El proveedor de eventos de Analysis Services obtiene el resultado de esta consulta Transact-SQL en formato XML, donde cada nombre de columna seleccionado se devuelve como un atributo de un elemento de fila:
<rows>
<row Employee="Ken J. Snchez" />
<row Employee="Amy E. Alberts" />
<row Employee="Terry Lee Duffy" />
<row Employee="Brian S. Welcker" />
</rows>
A continuación, escriba una transformación XSL que aplique formato a la lista de resultados en la consulta MDX completa. Por ejemplo, la transformación puede escribir las partes conocidas de la consulta en match="rows"
. A continuación, para cada fila, puede transformar el valor en un elemento en la especificación ON ROWS de la consulta MDX. Para transformar el XML, utilice la transformación XSL siguiente:
<?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>
El resultado de esta transformación es una consulta MDX completa:
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]
El proveedor de eventos de Analysis Services utiliza esta consulta, generada de forma dinámica cada vez que se ejecuta el proveedor de eventos, para buscar datos de eventos en el cubo.
En esta transformación XSL, el segmentador [Date].[Calendar].[CY 2002] está codificado de forma rígida en la transformación. Se puede pasar una consulta Transact-SQL al proveedor de eventos de Analysis Services mediante el argumento SlicerQuery para crear la cláusula WHERE de forma dinámica.
Los resultados de la consulta de filas y de la consulta del segmentador se combinan en un resultado XML único:
<rows>
<row Employee="Ken J. Snchez" />
<row Employee="Amy E. Alberts" />
<row Employee="Brian S. Welcker" />
</rows>
<slicers>
<slicer Calendar="CY 2002"/>
</slicers>
La transformación XSL se aplica a este XML para generar la consulta MDX dinámica.
Vea también
Conceptos
Definir el proveedor de eventos de Analysis Services
Otros recursos
Proveedor de eventos de Analysis Services
Definir proveedores de eventos
Proveedores de eventos estándar
Conceptos clave de MDX (MDX)