in src/PDWScripter/PDWscripter.cs [1387:1476]
private void getPartitioning(Boolean GetStructure, Boolean SourceFromFile)
{
partitionColumn = null;
partitionLeftOrRight = null;
partitionBoundaryClause = "";
StringBuilder partitionspec = new StringBuilder();
partitionBoundaries.Clear();
if (!SourceFromFile)
{
cmd.CommandText =
"select c.name " +
"from sys.tables t " +
"join sys.indexes i on(i.object_id = t.object_id and i.index_id < 2) " +
"join sys.index_columns ic on(ic.partition_ordinal > 0 " +
"and ic.index_id = i.index_id and ic.object_id = t.object_id) " +
"join sys.columns c on(c.object_id = ic.object_id " +
"and c.column_id = ic.column_id) " +
"where t.object_id = (select object_id from sys.tables where schema_name(schema_id) + '.' + name = '" + sourceTable + "') ";
partitionColumn = (string)cmd.ExecuteScalar();
if (partitionColumn != null)
{
cmd.CommandText =
"select pf.boundary_value_on_right from sys.partition_functions pf " +
"JOIN sys.partition_schemes ps on pf.function_id=ps.function_id " +
"JOIN sys.data_spaces ds on ps.data_space_id = ds.data_space_id " +
"JOIN sys.indexes si on si.data_space_id = ds.data_space_id " +
"WHERE si.object_id = (select object_id from sys.tables where schema_name(schema_id) + '.' + name = '" + sourceTable + "') ";
partitionLeftOrRight = ((bool)cmd.ExecuteScalar() ? "RIGHT" : "LEFT");
cmd.CommandText =
"select cast(sp.partition_number as int) as partition_number , prv.value as boundary_value, lower(sty.name) as boundary_value_type " +
"from sys.tables st join sys.indexes si on st.object_id = si.object_id and si.index_id <2" +
"join sys.partitions sp on sp.object_id = st.object_id " +
"and sp.index_id = si.index_id " +
"join sys.partition_schemes ps on ps.data_space_id = si.data_space_id " +
"join sys.partition_range_values prv on prv.function_id = ps.function_id " +
"join sys.partition_parameters pp on pp.function_id = ps.function_id " +
"join sys.types sty on sty.user_type_id = pp.user_type_id " +
"and prv.boundary_id = sp.partition_number " +
"where st.object_id = (select object_id from sys.tables where schema_name(schema_id) + '.' + name = '" + sourceTable + "') " +
"order by sp.partition_number ";
rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
while (rdr.Read())
{
partitionBoundaries.Add(new PartitionBoundary(
rdr.GetInt32(rdr.GetOrdinal("partition_number")),
rdr.GetValue(rdr.GetOrdinal("boundary_value")).ToString(),
rdr.GetString(rdr.GetOrdinal("boundary_value_type"))
));
}
}
rdr.Close();
if (GetStructure)
{
dbstruct.GetTable(sourceTable).DBPartition.partitionColumn = partitionColumn;
dbstruct.GetTable(sourceTable).DBPartition.partitionLeftOrRight = partitionLeftOrRight;
dbstruct.GetTable(sourceTable).DBPartition.partitionBoundaries = partitionBoundaries;
}
}
}
else
{
partitionBoundaries = dbstruct.GetTable(sourceTable).DBPartition.partitionBoundaries;
partitionColumn = dbstruct.GetTable(sourceTable).DBPartition.partitionColumn;
partitionLeftOrRight = dbstruct.GetTable(sourceTable).DBPartition.partitionLeftOrRight;
}
foreach (PartitionBoundary b in partitionBoundaries)
{
if (b.partition_number > 1)
{
partitionspec.Append("\r\n,");
}
partitionspec.Append("N'" + b.boundary_value + "'");
}
if (partitionspec.Length > 0)
{
partitionspec.Append(")");
}
partitionBoundaryClause = partitionspec.ToString();
}