Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie ADOMD.NET Serverobjekte, um benutzerdefinierte Funktionen (USER-Defined Functions, UDFs) und gespeicherte Prozeduren zu erstellen, die mit SQL Server Analysis Services Metadaten und Daten interagieren. Rufen Sie diese In-Process-Methoden über Multidimensional Expressions (MDX)- oder Data Mining Extensions (DMX)-Anweisungen auf, um zusätzliche Funktionalität ohne die mit der Netzwerkkommunikation verbundenen Latenzen bereitzustellen.
UDF-Beispiele
Eine UDF ist eine Methode, die Sie in einer MDX- oder DMX-Anweisung aufrufen. Sie akzeptiert eine beliebige Anzahl von Parametern und gibt einen beliebigen Datentyp zurück.
Eine mit MDX erstellte UDF ähnelt einer für DMX erstellten UDF. Der Hauptunterschied besteht darin, dass bestimmte Eigenschaften des Microsoft.AnalysisServices.AdomdServer.Context-Objekts, z. B. microsoft.AnalysisServices.AdomdServer.Context.CurrentCube und Microsoft.AnalysisServices.AdomdServer.Context.CurrentMiningModel-Eigenschaften, nur für eine Skriptsprache oder die andere verfügbar sind.
Die folgenden Beispiele zeigen, wie Sie eine UDF verwenden, um eine Knotenbeschreibung zurückzugeben, Tupel zu filtern und einen Filter auf ein Tupel anzuwenden.
Zurückgeben einer Knotenbeschreibung
Im folgenden Beispiel wird eine UDF erstellt, die die Knotenbeschreibung für einen angegebenen Knoten zurückgibt. Die UDF verwendet den aktuellen Kontext, in dem sie ausgeführt wird, und verwendet eine DMX-FROM-Klausel, um den Knoten aus dem aktuellen Miningmodell abzurufen.
public string GetNodeDescription(string nodeUniqueName)
{
return Context.CurrentMiningModel.GetNodeFromUniqueName(nodeUniqueName).Description;
}
Nachdem Sie die UDF bereitgestellt haben, verwenden Sie den folgenden DMX-Ausdruck, um den wahrscheinlichsten Vorhersageknoten abzurufen. Die Beschreibung enthält die Bedingungen, aus denen der Vorhersageknoten besteht.
select Cluster(), SampleAssembly.GetNodeDescription( PredictNodeId(Cluster()) ) FROM [Customer Clusters]
Zurückgeben von Tupeln
Im folgenden Beispiel wird ein Satz und eine Rückgabeanzahl verwendet. Sie wählt zufällig Tupel aus der Menge aus und gibt die resultierende Teilmenge zurück:
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();
}
Die folgende MDX-Abfrage ruft die UDF auf und ruft fünf zufällige Bundesstaaten oder Provinzen aus der Adventure Works-Datenbank ab.
SELECT SampleAssembly.RandomSample([Geography].[State-Province].Members, 5) on ROWS,
[Date].[Calendar].[Calendar Year] on COLUMNS
FROM [Adventure Works]
WHERE [Measures].[Reseller Freight Cost]
Anwenden eines Filters auf ein Tupel
Das folgende Beispiel wendet einen Expression Filter auf jedes Tupel in einem Satz an und gibt die übereinstimmenden Tupel zurück.
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();
}
Die folgende MDX-Abfrage ruft die UDF auf, um Städte zurückzugeben, deren Namen mit A beginnen.
Select Measures.Members on Rows,
SampleAssembly.FilterSet([Customer].[Customer Geography].[City], "[Customer].[Customer Geography].[City].CurrentMember.Name < 'B'") on Columns
From [Adventure Works]
Beispiel für eine gespeicherte Prozedur
In folgendem Beispiel verwendet eine MDX-basierte, gespeicherte Prozedur AMO, um bei Bedarf Partitionen für Internet Sales zu erstellen.
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
}