Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med ADOMD.NET serverobjekt kan du skapa användardefinierad funktion (UDF) eller lagrade procedurer för Microsoft SQL Server Analysis Services som interagerar med metadata och data från servern. De här processmetoderna anropas via MDX-instruktioner (Multidimensional Expressions) eller DMX-instruktioner (Data Mining Extensions) för att tillhandahålla ytterligare funktioner utan fördröjningar som är associerade med nätverkskommunikation.
UDF-exempel
En UDF är en metod som kan anropas i kontexten för en MDX- eller DMX-instruktion, kan ta valfritt antal parametrar och kan returnera alla typer av data.
En UDF som skapats med MDX liknar en som skapats för DMX. Den största skillnaden är att vissa egenskaper för objektet Microsoft.AnalysisServices.AdomdServer.Context, till exempel egenskaperna Microsoft.AnalysisServices.AdomdServer.Context.CurrentCube och Microsoft.AnalysisServices.AdomdServer.Context.CurrentMiningModel, endast är tillgängliga för det ena skriptspråket eller det andra.
Följande exempel visar hur du använder en UDF för att returnera en nodbeskrivning, filtrera tupplar och tillämpa ett filter på en tupl.
Returnera en nodbeskrivning
I följande exempel skapas en UDF som returnerar nodbeskrivningen för en angiven nod. UDF använder den aktuella kontexten där den körs och använder en DMX FROM-sats för att hämta noden från den aktuella gruvmodellen.
public string GetNodeDescription(string nodeUniqueName)
{
return Context.CurrentMiningModel.GetNodeFromUniqueName(nodeUniqueName).Description;
}
När det har implementerats kan det tidigare UDF-exemplet anropas med följande DMX-uttryck, vilket hämtar den mest sannolika förutsägelse-noden. Beskrivningen innehåller information som beskriver de villkor som utgör förutsägelsenoden.
select Cluster(), SampleAssembly.GetNodeDescription( PredictNodeId(Cluster()) ) FROM [Customer Clusters]
Returnerar tupplar
Följande exempel tar en uppsättning och ett antal element som ska returneras, och hämtar slumpmässigt tupplar från uppsättningen för att returnera en delmängd:
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();
}
Föregående exempel anropas i följande MDX-exempel. I det här MDX-exemplet hämtas fem slumpmässiga delstater eller provinser från Adventure Works-databasen .
SELECT SampleAssembly.RandomSample([Geography].[State-Province].Members, 5) on ROWS,
[Date].[Calendar].[Calendar Year] on COLUMNS
FROM [Adventure Works]
WHERE [Measures].[Reseller Freight Cost]
Tillämpa ett filter på en tupl
I följande exempel definieras en UDF som tar en uppsättning och tillämpar ett filter på varje tuppel i uppsättningen med hjälp av Expressionobjektet. Alla tupplar som överensstämmer med filtret läggs till i en uppsättning som returneras.
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();
}
Föregående exempel anropas i följande MDX-exempel, som filtrerar uppsättningen till städer med namn som börjar med "A".
Select Measures.Members on Rows,
SampleAssembly.FilterSet([Customer].[Customer Geography].[City], "[Customer].[Customer Geography].[City].CurrentMember.Name < 'B'") on Columns
From [Adventure Works]
Exempel på lagrad procedur
I följande exempel använder en MDX-baserad lagrad procedur AMO för att skapa partitioner, om det behövs, för Internetförsäljning.
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
}