Использовать результаты запроса XMLA в службах Integration Services
-
20-08-2019 - |
Вопрос
У меня есть запрос XMLA, который возвращает состояние и дату последней обработки куба служб Analysis Services в формате XML, например:
Запрос:
<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
<RequestType>DISCOVER_XML_METADATA</RequestType>
<Restrictions >
<RestrictionList xmlns="urn:schemas-microsoft-com:xml-analysis">
<DatabaseID>SSAS - Premium and Claims V2</DatabaseID>
<CubeID>PDW04 1</CubeID>
<ObjectExpansion>ReferenceOnly</ObjectExpansion>
</RestrictionList>
</Restrictions>
<Properties />
</Discover>
Результат:
<return xmlns="urn:schemas-microsoft-com:xml-analysis">
<root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:schema targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset" xmlns:sql="urn:schemas-microsoft-com:xml-sql" elementFormDefault="qualified">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="row" type="row" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="uuid">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}" />
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="xmlDocument">
<xsd:sequence>
<xsd:any />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="row">
<xsd:sequence>
<xsd:element sql:field="METADATA" name="METADATA" type="xmlDocument" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<row>
<xars:METADATA xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:xars="urn:schemas-microsoft-com:xml-analysis:rowset">
<Cube>
<Name>Premium</Name>
<ID>PDW04 1</ID>
<CreatedTimestamp>2008-11-23T22:31:06</CreatedTimestamp>
<LastSchemaUpdate>2009-01-22T00:50:13</LastSchemaUpdate>
<LastProcessed>2009-01-07T22:28:34</LastProcessed>
<State>Processed</State>
</Cube>
</xars:METADATA>
</row>
</root>
</return>
Я хотел бы иметь возможность использовать этот запрос XMLA в пакете Integration Services, анализируя и сохраняя результат в таблице базы данных SQL Server.Однако единственными задачами, которые, по-видимому, выполняют запрос XMLA, является задача "Службы анализа выполняют DDL", у которой, насколько я могу судить, нет метода возврата результатов запроса.
Есть ли у кого-нибудь какие-либо предложения о том, как еще этого добиться?
Решение
Хотя вы можете запускать "обычные" многомерные выражения / XMLA через различные механизмы в SSIS, в том числе через задачу Execute SQL, она всегда будет заключать его внутрь .является методом верхнего уровня точно так же, как и не может быть обернут внутри, отсюда и проблема.
У вас есть два возможных решения:
- Оберните ваш XML-файл внутри задачи Execute SQL, используя вызов OPENQUERY внутри вашей реляционной базы данных.Вы бы сделали что-то вроде SELECT * из OPENQUERY(), и вы действительно можете выполнить хорошую работу по разбору результирующего набора XML внутри SQL Server.
- Откройте свои SSAS-серверы, настроив HTTP-доступ (http://www.microsoft.com/technet/prodtechnol/sql/2005/httpasws.mspx) таким образом, вы можете отправить XMLA как вызов веб-службы.В SSIS есть задача веб-службы, которую вы можете использовать для выполнения своих задач и использования результатов.
Оба этих варианта, очевидно, имеют некоторые недостатки.
Другие советы
Для команд обнаружения:
Это работает очень хорошо для меня:
Создайте задачу сценария, используя пространство имен XMLA, выдайте запрос discover.Как только вы получите ответ, проанализируйте xml-файл и добавьте в VB.NET Datatable и вставьте проанализированные данные в таблицу sql.
Вы также можете использовать новый синтаксис DMV в SSAS 2008 или функцию DMV из АССП чтобы в SSAS 2005 вернуть эти данные в табличном формате.