2015-11-24 4 views
0

У меня есть сервер SSAS с аналитической табличной моделью. Он имеет несколько измерений и таблицы фактов.Идентификатор измерения/идентификатор таблицы фактов на SSAS

Я хочу создать динамический XMLA-код для обработки измерений/таблиц фактов. Используя SSMS, я могу скрипт из примера XMLA следующим образом:

<Process xmlns="http://schemas.microsoft.com/analysisservices/2003/engine"> 
    <Type>ProcessFull</Type> 
    <Object> 
    <DatabaseID>DB1</DatabaseID> 
    <DimensionID>FactTable1_cd8ad531-34f1-42df-b34e-a535eed297c1</DimensionID> 
    </Object> 
</Process> 

Где найти DatabaseID/DimensionID информацию о модели на SSAS так я могу использовать его для целей динамического сценария? Есть ли какие-либо DMV (или подобные), которые вернут мне такую ​​информацию?

+0

Какой инструмент или язык программирования создает динамический XMLA? Если вы скажете T-SQL и связанные серверы, мой ответ будет отличаться, если вы скажете SSIS и задачу сценария C#. – GregGalloway

+0

Я бы использовал SSIS, но если решение с T-SQL и связанными серверами было бы более элегантным, я бы подумал об использовании этого. Могли бы вы, возможно, поделиться обоими? – DNac

ответ

0

Создание диспетчера соединений служб Analysis Services в SSIS. Затем создайте новую задачу сценария C# в SSIS и добавьте ссылку на AMO (Microsoft.AnalysisServices). Я обычно делаю это, выбирая «Добавить ссылку ... Обзор ...», затем вставляя «C: \ Windows \ assembly \ GAC_MSIL \ Microsoft.AnalysisServices \», ища версию, которая будет установлена ​​на сервере, где я буду развертывать этот SSIS пакет. Затем добавьте «using Microsoft.AnalysisServices»; в верхней части вашего кода. Вот функция Main():

public void Main() 
{ 
    // Get Server and Database name from DTS connection object 
    string sServer = ""; 
    string sDatabase = ""; 
    foreach (ConnectionManager oConn in this.Dts.Connections) 
    { 
     if (oConn.CreationName.StartsWith("MSOLAP")) 
     { 
      sServer = (string)oConn.Properties["ServerName"].GetValue(oConn); 
      sDatabase = (string)oConn.Properties["InitialCatalog"].GetValue(oConn); 
      break; 
     } 
    } 

    if (string.IsNullOrEmpty(sServer) || string.IsNullOrEmpty(sDatabase)) 
    { 
     Dts.TaskResult = (int)ScriptResults.Failure; 
     throw new Exception("Could not find or parse the SSAS connection string"); 
    } 

    Server oServer = new Server(); 
    oServer.Connect(sServer); 

    Database oDB = oServer.Databases.FindByName(sDatabase); 
    if (oDB == null) 
    { 
     oServer.Disconnect(); 
     Dts.TaskResult = (int)ScriptResults.Failure; 
     throw new Exception("Did not find expected SSAS database: " + sDatabase); 
    } 

    Dimension dim = oDB.Dimensions.GetByName("Employee"); 
    string sDimensionID = dim.ID; 
    string sDatabaseID = oDB.ID; 

    MessageBox.Show(sDatabaseID + " - " + sDimensionID); 

    oServer.Disconnect(); 

    Dts.TaskResult = (int)ScriptResults.Success; 
} 

Кстати, я бы порекомендовал не сбрасывать со зданием XMLA. Просто используйте AMO сделать обработку:

dim.Process(ProcessType.ProcessFull); 

Я не знаю, как получить идентификатор базы данных чисто с DMV против SSAS табличного кроме измельчения кучи XML. Поэтому я бы не рекомендовал связанный сервер.

Смежные вопросы