2016-01-07 2 views
0

Я использую компонент сценария в ssis с кодом C#, используя пространство имен Microsoft.Analysisservices для извлечения метаданных куба. Код выглядит как этотМетаданные метаданных SSAS с использованием компонента сценария SSIS с программой C#

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 
using Microsoft.SqlServer.Dts.Runtime.Wrapper; 
using Microsoft.AnalysisServices; 
using System.Windows.Forms; 

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
public class ScriptMain : UserComponent 
{ 

//IDTSConnectionManager100 connMgr; 
Server OLAPServer = new Server();  

public override void AcquireConnections(object Transaction) 
{ 
    OLAPServer.Connect(this.Connections.OLAPConnection.ConnectionString); 
} 


public override void PreExecute() 
{ 
    base.PreExecute(); 
    /* 
     Add your code here for preprocessing or remove if not needed 
    */ 
} 

public override void PostExecute() 
{ 
    base.PostExecute(); 
    /* 
     Add your code here for postprocessing or remove if not needed 
     You can set read/write variables here, for example: 
     Variables.MyIntVar = 100 
    */ 
} 

public override void CreateNewOutputRows() 
{ 
    IDTSVariables100 vars = null; 
    string OLAPDBName; 
    VariableDispenser.LockOneForRead("OLAPDBName", ref vars); 
    Database OLAPDB; 

    OLAPDBName = vars[0].Value.ToString(); 
    try 
    { 
     OLAPDB = OLAPServer.Databases.GetByName(OLAPDBName); 
    } 
    catch 
    { 
     return; 
    } 

    // loop through cubes 
     CubeCollection Cubes = OLAPDB.Cubes; 
     MeasureGroupCollection Mgroups; 
     CubeDimensionCollection Dimensions; 
     MeasureGroupDimensionCollection MgroupDims; 
     DimensionAttributeCollection Attributes; 



     foreach (Cube cb in Cubes) 
     { 
     //Test for one Measure Group 
     //MeasureGroup mgroup = Mgroups.GetByName("Inward Exposure"); 

      Mgroups = cb.MeasureGroups; 
     // all dimensions associated with that Measure Group 

      // loop through Measure Groups 
      foreach (MeasureGroup mg in Mgroups) 
      { 
       // loop though all cube dimensions 
       Dimensions = cb.Dimensions;**strong text** 
       foreach (CubeDimension dim in Dimensions) 
       { 
        bool CanBeAnalysed = false;**strong text** 
        // loop through dimensions and see if dimension exists in mgroupDims (ie check if it can be analysed) 

        MgroupDims = mg.Dimensions; 
        foreach (MeasureGroupDimension mgd in MgroupDims) 
        { 
         if (mgd.CubeDimension == dim) 
         { 
          CanBeAnalysed = true; 

          break; 
         } 

        } 


       // loop through each Measure and Attribute a 
        String DimName = dim.Name; 
        bool DimVisible = dim.Visible; 
        String MgroupName = mg.Name; 
        String CubeName = cb.Name; 
        String MeasureExpression; 
        String Description; 




        // for every attribute in dimension 
        Attributes = dim.Dimension.Attributes;       

        foreach (DimensionAttribute Attr in Attributes) 
        { 
         String AttrName = Attr.Name; 
         bool AttrVisible = Attr.AttributeHierarchyVisible; 
         String AttrNameColumn = Attr.NameColumn.ToString(); 
         String AttributeRelationship = Attr.AttributeRelationships.ToString(); 

         // get every measure in measuregroup 

         foreach (Measure m in mg.Measures) 
         { 
          String MeasureName = m.Name.ToString(); 
          bool MeasureVisible = m.Visible; 
          String MeasureNameColumn = m.Source.ToString(); 


          if (m.MeasureExpression != null) 
          { 
          // MessageBox.Show(m.MeasureExpression.ToString()); 
           MeasureExpression = m.MeasureExpression.ToString(); 

          } 
          else 
          { 
          // MessageBox.Show(m.MeasureExpression.ToString()); 
           MeasureExpression = " " ; 
          } 

          if (m.Description != null) 
          { 
           // MessageBox.Show(m.MeasureExpression.ToString()); 
           Description = m.Description.ToString(); 

          } 
          else 
          { 
           // MessageBox.Show(m.MeasureExpression.ToString()); 
           Description = " "; 
          } 



          Output0Buffer.AddRow(); 
          Output0Buffer.OLAPDBName = OLAPDBName; 
          Output0Buffer.CubeName = CubeName; 
          Output0Buffer.DimensionName = DimName; 
          Output0Buffer.DimensionVisible = DimVisible; 
          Output0Buffer.AttrDDSColumn = AttrNameColumn; 
          Output0Buffer.AttrName = AttrName; 
          Output0Buffer.AttrVisible = AttrVisible; 
          Output0Buffer.MeasureGroupName = MgroupName; 
          Output0Buffer.MeasureName = MeasureName; 
          Output0Buffer.MeasureVisible = MeasureVisible; 
          Output0Buffer.MeasureDDSColumn = MeasureNameColumn; 
          Output0Buffer.IsAnalysable = CanBeAnalysed; 
          Output0Buffer.MeasureExpression = MeasureExpression; 
          Output0Buffer.Description = Description; 
          Output0Buffer.AttributeRelationship = AttributeRelationship; 

         } 
        } 




       } // end of Cube Dim Loop 

      } // end of Measure Group loop 

     } // end of cube loop 


} 


} 

Я был успешным в получении метаданных кубы с выше code.However, я застрял на получение метаданных перспективного куба и отношений групп с мерой, то есть ли мера групп много. Любая помощь очень ценится.

ответ

0

Вот несколько кодов для определения отношений измерения, включая много-ко-многим. Смотрите функцию GetDimensionUsage: https://bidshelper.svn.codeplex.com/svn/SSAS/PrinterFriendlyDimensionUsage.cs

Вот код вокруг навигационных точек зрения: https://bidshelper.svn.codeplex.com/svn/SSAS/TriStatePerspectivesPlugin.cs

Начать чтение по следующей строке:

if (perspective.MeasureGroups.Contains(mg.Name))