Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Con gli oggetti del server ADOMD.NET, è possibile creare funzioni definite dall'utente (UDF) o stored procedure (procedure memorizzate) per Microsoft SQL Server Analysis Services che interagiscono con metadati e dati del server. Questi metodi in-process vengono chiamati tramite istruzioni MDX (Multidimensional Expressions) o DMX (Data Mining Extensions) per fornire funzionalità aggiunte senza latenze associate alle comunicazioni di rete.
Esempi di funzioni definite dall'utente
Una funzione definita dall'utente è un metodo che può essere chiamato nel contesto di un'istruzione MDX o DMX, può accettare un numero qualsiasi di parametri e può restituire qualsiasi tipo di dati.
Una UDF creata con MDX è simile a quella creata per DMX. La differenza principale è che alcune proprietà dell'oggetto Microsoft.AnalysisServices.AdomdServer.Context, ad esempio Microsoft.AnalysisServices.AdomdServer.Context.CurrentCube e Microsoft.AnalysisServices.AdomdServer.Context.CurrentMiningModel, sono disponibili solo per un linguaggio di scripting o per l'altro.
Gli esempi seguenti illustrano come utilizzare una funzione definita dall'utente (UDF) per restituire una descrizione del nodo, filtrare le tuple e applicare un filtro a una tupla.
Restituzione di una descrizione del nodo
Nell'esempio seguente viene creata una UDF che fornisce la descrizione del nodo per un nodo indicato. La funzionalità definita dall'utente utilizza il contesto attuale in cui viene eseguita e impiega una clausola FROM DMX per recuperare il nodo dal modello di mining corrente.
public string GetNodeDescription(string nodeUniqueName)
{
return Context.CurrentMiningModel.GetNodeFromUniqueName(nodeUniqueName).Description;
}
Dopo la distribuzione, il precedente esempio di UDF può essere chiamato dall'espressione DMX seguente, che recupera il nodo di stima più probabile. La descrizione contiene informazioni che descrivono le condizioni che costituiscono il nodo di stima.
select Cluster(), SampleAssembly.GetNodeDescription( PredictNodeId(Cluster()) ) FROM [Customer Clusters]
Restituzione delle tuple
L'esempio seguente accetta un set e un conteggio restituito e recupera in modo casuale le tuple dal set, restituendo un subset finale:
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();
}
L'esempio precedente viene chiamato nell'esempio MDX seguente. In questo esempio MDX vengono recuperati cinque stati casuali o province dal database Adventure Works .
SELECT SampleAssembly.RandomSample([Geography].[State-Province].Members, 5) on ROWS,
[Date].[Calendar].[Calendar Year] on COLUMNS
FROM [Adventure Works]
WHERE [Measures].[Reseller Freight Cost]
Applicazione di un filtro a una tupla
Nell'esempio seguente viene definita una UDF che accetta un set e applica un filtro a ogni tupla nel set, usando l'oggetto "Expression". Tutte le tuple conformi al filtro verranno aggiunte a un set che verrà restituito.
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();
}
L'esempio precedente viene chiamato nell'esempio MDX seguente, che filtra il set su città con nomi che iniziano con "A".
Select Measures.Members on Rows,
SampleAssembly.FilterSet([Customer].[Customer Geography].[City], "[Customer].[Customer Geography].[City].CurrentMember.Name < 'B'") on Columns
From [Adventure Works]
Esempio di procedura memorizzata
Nell'esempio seguente, una procedura memorizzata basata su MDX utilizza AMO per creare partizioni se necessario per Internet Sales.
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
}