Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met ADOMD.NET serverobjecten kunt u door de gebruiker gedefinieerde functie (UDF) of opgeslagen procedures maken voor Microsoft SQL Server Analysis Services die communiceren met metagegevens en gegevens van de server. Deze in-process methoden worden aangeroepen via MDX-instructies (Multidimensional Expressions) of Data Mining Extensions (DMX) om extra functionaliteit te bieden zonder de latenties die zijn gekoppeld aan netwerkcommunicatie.
UDF-voorbeelden
Een UDF is een methode die kan worden aangeroepen in de context van een MDX- of DMX-instructie, kan een willekeurig aantal parameters aannemen en elk type gegevens retourneren.
Een UDF die is gemaakt met MDX, is vergelijkbaar met een UDF die is gemaakt voor DMX. Het belangrijkste verschil is dat bepaalde eigenschappen van het object Microsoft.AnalysisServices.AdomdServer.Context, zoals de eigenschappen Microsoft.AnalysisServices.AdomdServer.Context.CurrentCube en Microsoft.AnalysisServices.AdomdServer.Context.CurrentMiningModel, slechts beschikbaar zijn voor één scripttaal of de andere.
In de volgende voorbeelden ziet u hoe u een UDF gebruikt om een beschrijving van een knooppunt te retourneren, tuples te filteren en een filter toe te passen op een tuple.
Een beschrijving van een knooppunt retourneren
In het volgende voorbeeld wordt een UDF gemaakt die de beschrijving van het knooppunt voor een opgegeven knooppunt retourneert. De UDF gebruikt de huidige context waarin deze wordt uitgevoerd en gebruikt een DMX FROM-component om het knooppunt op te halen uit het huidige miningmodel.
public string GetNodeDescription(string nodeUniqueName)
{
return Context.CurrentMiningModel.GetNodeFromUniqueName(nodeUniqueName).Description;
}
Na de implementatie kan het vorige UDF-voorbeeld worden aangeroepen door de volgende DMX-expressie, waarmee het meest waarschijnlijke voorspellingsknooppunt wordt opgehaald. De beschrijving bevat informatie die de voorwaarden beschrijft waaruit het voorspellingsknooppunt bestaat.
select Cluster(), SampleAssembly.GetNodeDescription( PredictNodeId(Cluster()) ) FROM [Customer Clusters]
Tuples retourneren
In het volgende voorbeeld worden een verzameling en een retouraantal gebruikt om willekeurig tuples uit de verzameling op te halen, waarbij een laatste deelverzameling wordt geretourneerd.
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();
}
Het vorige voorbeeld wordt aangeroepen in het volgende MDX-voorbeeld. In dit MDX-voorbeeld worden vijf willekeurige staten of provincies opgehaald uit de Adventure Works-database .
SELECT SampleAssembly.RandomSample([Geography].[State-Province].Members, 5) on ROWS,
[Date].[Calendar].[Calendar Year] on COLUMNS
FROM [Adventure Works]
WHERE [Measures].[Reseller Freight Cost]
Een filter toepassen op een tuple
In het volgende voorbeeld wordt een UDF gedefinieerd die een set gebruikt en een filter toepast op elke tuple in de set, met behulp van het expressieobject. Alle tuples die voldoen aan het filter, zullen worden toegevoegd aan een set die wordt teruggegeven.
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();
}
Het vorige voorbeeld wordt aangeroepen in het volgende MDX-voorbeeld, waarmee de set wordt gefilterd op steden met namen die beginnen met 'A'.
Select Measures.Members on Rows,
SampleAssembly.FilterSet([Customer].[Customer Geography].[City], "[Customer].[Customer Geography].[City].CurrentMember.Name < 'B'") on Columns
From [Adventure Works]
Voorbeeld van opgeslagen procedure
In het volgende voorbeeld maakt een op MDX gebaseerde opgeslagen procedure gebruik van AMO om partities te maken, indien nodig, voor internetverkoop.
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
}