Notification Services에 대한 MDX 쿼리
MDX(Multidimensional Expression) 쿼리의 결과 집합은 여러 차원을 포함할 수 있습니다. 그러나 이 이벤트 공급자의 경우 해당 MDX 쿼리가 플랫 행 집합을 반환하고 이 행 집합이 이벤트 집합으로 Notification Services 응용 프로그램에 전송될 수 있어야 합니다.
MDX 쿼리는 이벤트 클래스 필드에 매핑되는 열을 포함하는 결과 집합을 반환해야 합니다. 첫 번째 MDX 결과 열은 첫 번째 이벤트 클래스 필드에 매핑되어야 하고 두 번째 결과 열은 두 번째 이벤트 클래스 필드에 매핑되어야 하며 나머지 열도 마찬가지입니다.
Analysis Services 이벤트 공급자용 MDX 쿼리는 정적일 수 있습니다. 정적은 사용자가 응용 프로그램을 만들 때 쿼리를 완벽하게 알고 있음을 의미합니다. 또는 동적일 수도 있습니다. 동적은 Transact-SQL 쿼리를 실행하여 ROWS 축의 요소나 MDX 쿼리 slicer의 요소를 가져옴을 의미합니다. Transact-SQL 쿼리의 결과는 XSL 변환을 통해 최종 MDX 쿼리를 생성하는 데 사용됩니다.
정적 MDX 쿼리
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>
다음은 이 이벤트 클래스에 매핑되는 적절한 결과를 반환하는 정적 MDX 쿼리의 예입니다.
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 큐브에서 3개의 측정값을 선택합니다. 이러한 측정값은 결과 집합의 열에 해당합니다. 쿼리는 2명의 직원 Ken J. Sánchez와 Amy E. Alberts에 관련된 행만 선택하도록 추가적으로 제한됩니다.
Order Time 차원에는 여러 개의 튜플이 있으므로 쿼리는 2002년 데이터만 표시하도록 제한되거나 "분할"됩니다.
최종 결과 집합으로 2002년 동안의 선택된 직원에 대한 Reseller Gross Profit Margin, Reseller Order Quantity 및 Reseller Sales Amount 값을 보여 주는 테이블이 생성됩니다.
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에서 이 쿼리를 실행하면 2차원 결과 집합이 이벤트 일괄 처리로 이벤트 클래스에 전송됩니다.
동적 MDX 쿼리
Notification Services 응용 프로그램에서 사용자는 해당 응용 프로그램을 구독하는 직원에 대한 데이터만 선택하려고 할 수 있습니다. 그러나 직원들이 구독을 추가 및 삭제할 수 있으므로 응용 프로그램을 빌드할 때 고정된 정적 쿼리 목록이 존재하지 않도록 합니다.
구독 여부에 관계없이 각 직원에 대한 레코드를 반환하는 정적 쿼리를 작성할 수 있습니다. 그러나 한 큐브에 수만 명의 직원이 포함되어 있으면 정적 쿼리에서는 각 직원에 대해 행 1개를 반환합니다. 따라서 관련 없는 데이터를 포함하는 대형 이벤트 일괄 처리가 형성됩니다.
동적 MDX 쿼리를 작성하면 응용 프로그램 성능을 크게 향상시킬 수 있습니다. 다음 스키마를 사용하는 구독 클래스를 참조하십시오.
<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>
그런 후 결과 목록의 서식을 완전한 MDX 쿼리로 지정하는 XSL 변환을 작성합니다. 예를 들어 해당 변환에서는 match="rows"
에 쿼리의 알려진 부분을 작성합니다. 그런 다음 각 행에 대해 해당 값을 MDX 쿼리의 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>
이 변환의 결과로 완전한 MDX 쿼리가 생성됩니다.
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 변환에서 slicer [Date].[Calendar].[CY 2002]는 해당 변환으로 하드 코드됩니다. SlicerQuery 인수를 통해 Transact-SQL 쿼리를 Analysis Services 이벤트 공급자로 전달하여 WHERE 절을 동적으로 만들 수 있습니다.
행 쿼리 및 slicer 쿼리의 결과가 조합되어 다음과 같은 단일 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에 적용되어 동적 MDX 쿼리를 생성합니다.
참고 항목
개념
관련 자료
Analysis Services 이벤트 공급자
이벤트 공급자 정의
표준 이벤트 공급자
MDX의 주요 개념(MDX)