Aracılığıyla paylaş


Kullanıcı tanımlı işlevler ve saklı yordamlar

adomd ile.net sunucu nesneleri, kullanıcı tanımlı işlevi (udf) oluşturabilirsiniz veya saklı yordamlar için Microsoft  SQL Server  Analysis Servicessunucu veri ve meta verileri ile etkileşim. Bu işlem yöntemleri, ağ iletişimleri ile ilgili gecikmeleri olmadan ek işlevsellik sağlamak için çok boyutlu ifadeleri (mdx) veya veri Mining Extensions (dmx) deyimleri ile adlandırılır.

udf örnekleri

Bir udf bir mdx veya dmx deyimi bağlamında çağrılabilir, herhangi sayıda parametre alabilir ve herhangi bir veri türü döndürebilirsiniz yöntemidir.

Bir udf mdx kullanılarak oluşturulan dmx için oluşturulan benzer. Belirli özelliklerini temel fark ise Contextnesne, gibi CurrentCubeve CurrentMiningModelÖzellikler, yalnızca bir komut dosyası dili veya diğer kullanılabilir.

Aşağıdaki örnekler bir udf düğüm açıklama dönmek dizilerini filtre ve kayıt düzeni için bir filtre uygulamak için nasıl kullanılacağını gösterir.

Düğüm açıklama döndürme

Aşağıdaki örnek, belirtilen düğüm düğüm açıklamasını döndürür bir udf oluşturur. udf içindeki o çalıştırılıyor ve düğüm geçerli incelemesi modelinden almak için dmx from yan tümcesi kullanır geçerli içeriğini kullanır.

public string GetNodeDescription(string nodeUniqueName)
{
   return Context.CurrentMiningModel.GetNodeFromUniqueName(nodeUniqueName).Description;
}

public string GetNodeDescription(string nodeUniqueName)
{
   return Context.CurrentMiningModel.GetNodeFromUniqueName(nodeUniqueName).Description;
}

Dağıtıldıktan sonra önceki udf örnek olan en büyük olasılıkla tahmin düğümü döndürür aşağıdaki dmx ifade tarafından çağrılabilir. Açıklamayı tahmin düğümü şartları tanımlayan bilgileri içerir.

select Cluster(), SampleAssembly.GetNodeDescription( PredictNodeId(Cluster()) ) FROM [Customer Clusters]

select Cluster(), SampleAssembly.GetNodeDescription( PredictNodeId(Cluster()) ) FROM [Customer Clusters]

Dizilerini döndürme

Aşağıdaki örnek bir kümesi ve bir dönüş sayısı alır ve rasgele dizilerini döndüren son alt kümesinden alır:

public Set RandomSample(Set set, int returnCount)
{
   //Return the original set if there are fewer tuples
   //in the set than the number requested.
   if (set.Tuples.Count <= returnCount)
      return set;

   System.Random r = new System.Random();
   SetBuilder returnSet = new SetBuilder();

   //Retrieve random tuples until the return set is filled.
   int i = set.Tuples.Count;
   foreach (Tuple t in set.Tuples)
   {
      if (r.Next(i) < returnCount)
      {
         returnCount--;
         returnSet.Add(t);
      }
      i--;
      //Stop the loop if we have enough tuples.
      if (returnCount == 0)
         break;
   }
   return returnSet.ToSet();
}

public Set RandomSample(Set set, int returnCount)
{
   //Return the original set if there are fewer tuples
   //in the set than the number requested.
   if (set.Tuples.Count <= returnCount)
      return set;

   System.Random r = new System.Random();
   SetBuilder returnSet = new SetBuilder();

   //Retrieve random tuples until the return set is filled.
   int i = set.Tuples.Count;
   foreach (Tuple t in set.Tuples)
   {
      if (r.Next(i) < returnCount)
      {
         returnCount--;
         returnSet.Add(t);
      }
      i--;
      //Stop the loop if we have enough tuples.
      if (returnCount == 0)
         break;
   }
   return returnSet.ToSet();
}

Önceki örnekte, aşağıdaki mdx örnek olarak adlandırılır. Bu mdx örnek beş rastgele veya ilçeleri den alınan Adventure Works veritabanı.

SELECT SampleAssembly.RandomSample([Geography].[State-Province].Members, 5) on ROWS, 
[Date].[Calendar].[Calendar Year] on COLUMNS
FROM [Adventure Works]
WHERE [Measures].[Reseller Freight Cost]

SELECT SampleAssembly.RandomSample([Geography].[State-Province].Members, 5) on ROWS, 
[Date].[Calendar].[Calendar Year] on COLUMNS
FROM [Adventure Works]
WHERE [Measures].[Reseller Freight Cost]

Bir başlığın için filtre uygulama

Aşağıdaki örnekte, bir udf kümesi alır ve her başlığın kümesinde filtre uygulandığı ifade nesnesi kullanılarak tanımlanır. Filtreye uyan tüm dizilerini döndürülür kümesine eklenecek.

public static Set FilterSet(Set set, String filterExpression)
{
    Expression expr = new Expression(filterExpression);

    SetBuilder resultSetBuilder = new SetBuilder();

    foreach (Tuple tuple in set)
    {
        if ((bool)(expr.Calculate(tuple)))
        {
            resultSetBuilder.Add(tuple);
        }
    }

    return resultSetBuilder.ToSet();
}

Önceki örnekte, 'a' ile başlayan adları belirlenen şehirlere filtreleri aşağıdaki mdx örnek adı verilir.

Select Measures.Members on Rows,
SampleAssembly.FilterSet([Customer].[Customer Geography].[City], "[Customer].[Customer Geography].[City].CurrentMember.Name < 'B'") on Columns
From [Adventure Works]

Select Measures.Members on Rows,
SampleAssembly.FilterSet([Customer].[Customer Geography].[City], "[Customer].[Customer Geography].[City].CurrentMember.Name < 'B'") on Columns
From [Adventure Works]

Saklı yordam örneği

Aşağıdaki örnekte, gerekiyorsa Internet satış için bölümler oluşturmak için amo mdx tabanlı saklı yordam kullanır.

public static void CreateInternetSalesMeasureGroupPartitions()
{
    //Check the current state of the data warehouse and 
    //create partitions with AMO if necessary
    #region Retrieve order date of last sales transaction

    // Open a connection to the data warehouse
    // TODO: Change the first string parameter to reflect the right server\instance.
    SqlConnection conn = new SqlConnection(string.Format("data source={0};initial catalog={1};Integrated Security=SSPI", "server\\instance", Context.CurrentDatabaseName));
    conn.Open();

    // Create a command
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;

    // Get the order date key of the last internet sale
    int lastInternetSaleDateKey = 0;
    cmd.CommandText = "select max(OrderDateKey) from FactInternetSales";
    lastInternetSaleDateKey = (int)cmd.ExecuteScalar();

    // Get the order date key of the last reseller sale
    int lastResellerSaleDateKey = 0;
    cmd.CommandText = "select max(OrderDateKey) from FactResellerSales";
    lastResellerSaleDateKey = (int)cmd.ExecuteScalar();
    #endregion

    #region Create partitions

    // Connect to the calling session
    Server svr = new Server();
    svr.Connect("*");

    // Get the Adventure Works cube
    Database db = svr.Databases.GetByName(Context.CurrentDatabaseName);
    Cube cube = db.Cubes[0];

    MeasureGroup mg;
    int maxOrderDateKey;

    mg = cube.MeasureGroups.GetByName("Internet Sales");
    maxOrderDateKey = 0;
    foreach (Partition part in mg.Partitions)
    {
        maxOrderDateKey = Math.Max(maxOrderDateKey, Convert.ToInt32(
            part.Annotations.Find("LastOrderDateKey").Value.Value,
            System.Globalization.CultureInfo.InvariantCulture));
    }

    if (maxOrderDateKey < lastInternetSaleDateKey)
    {
        Partition part = mg.Partitions.Add("Internet_Sales_"
            + lastInternetSaleDateKey);
        part.StorageMode = StorageMode.Molap;
        part.Source = new QueryBinding(db.DataSources[0].ID,
            "SELECT * FROM [dbo].[FactInternetSales] WHERE OrderDateKey > '"
            + maxOrderDateKey + "' and OrderDateKey <= '" + lastInternetSaleDateKey + "'");
        part.Annotations.Add("LastOrderDateKey", Convert.ToString(lastInternetSaleDateKey,
            System.Globalization.CultureInfo.InvariantCulture));
        part.Update();
        part.Process();
    }

    svr.Disconnect();

    #endregion
}