The first necessary step in dynamically creating cube partitions is to determine if the partition already exists. If the partition does not exists then we create the partition, if it does exists we simply process the existing partition. Recently I gave a free webinar online at PragmaticWorks.com and a few of the attendees wanted more details on the script task I used, so here we go. It’s also important to note that I used a daily partitioning strategy for the webinar. This is important because the naming conventions of my partitions included the partition name and date that I used as a filter. For example:
In this blog post I will walk you through step by step setting up this script task. Please see below. First the setup:
- Create the following variables, if you are in 2012 or 2014 create these as package parameters. We will use these parameters to establish our connection to Analysis Services and then build out the partition name dynamically.
- Now we need to create another variable, this variable will be used in our control flow to determine if we should create the partition or process the partition, we will get to this part in a bit.
The Script Task: (Setup) Now that we have created our variables and have that part set up we are going to build our script task.
- Step 1) Drag a script task component from the toolbox into your control flow.
- Step 2) Open the task for editing and choose C# as the script language.
- Step 3) ReadOnlyVariables: Select all the variables from Step 1 in the setup section.
- Step 4) ReadWriteVariables: Select the variable intDoesPartitionExists
- Step 5) Finally, click the Edit Script button.
The Script Task: (Code)
- Step 1) Add the Microsoft.AnalysisServices reference.
- Step 3) Finally we can add our code. In this section we are going to use the parameters previously created to connect to our cube and then check to see if a partition exists. For this blog we simply hardcoded these values for demonstration purposes but typically we would set these values dynamically. If the partition exists I populate the variable intDoesPartitionExists with a value of 1 for True. If the partition does not exists I populate it with the value of 0 for false. I then use this variable in the control flow to determine whether to process or create partitions.
- Step 4) Find the section titled “public void main() and paste the following code where it says Add your code here
// TODO: Add your code here
string serverName = "";
string databaseName = "";
string cubeName = "";
string measuregroupName = "";
string partitionname = "";
string Date = "";
//Retrieve the server, database, cube, etc. details from the variables
serverName = Dts.Variables["ServerName"].Value.ToString();
databaseName = Dts.Variables["DatabaseName"].Value.ToString();
cubeName = Dts.Variables["CubeName"].Value.ToString();
measuregroupName = Dts.Variables["MeasureGroupName"].Value.ToString();
partitionname = Dts.Variables["MeasureGroupPartitionName"].Value.ToString();
Date = Dts.Variables["Date"].Value.ToString();
//Build the connection string
string ConnectionString = "Data Source=" + serverName + ";Catalog=" + databaseName + ";";
//Connect to the server and select the database, cube, etc.
Server srv = new Server();
srv.Connect(ConnectionString);
Database db = srv.Databases.FindByName(databaseName);
Cube cb = db.Cubes.FindByName(cubeName);
MeasureGroup mg = cb.MeasureGroups.FindByName(measuregroupName);
if (mg.Partitions.ContainsName(partitionname + "_" + Date))
{
Dts.Variables["intDoesPartitionExists"].Value = 1;
}
else
{
Dts.Variables["intDoesPartitionExists"].Value = 0;
}
srv.Disconnect();
srv.Dispose();
You can find my webinar on Processing SSAS with SSIS at the following link: http://pragmaticworks.com/Training/FreeTraining/ViewWebinar/WebinarID/1714 Thank you for looking!
Pingback: Processing SSAS Cubes with SSIS –Q & A | MitchellSQL