在表格模型中创建表格、分区和列
适用于:SQL Server 2016 及更高版本的 Analysis Services Azure Analysis Services Fabric/Power BI Premium
在表格模型中,表由行和列组成。 将行组织到分区中,以支持增量数据刷新。 表格解决方案可以支持多种类型的表,具体取决于数据来自何处:
常规表,其中数据源自关系数据源,通过数据提供程序。
推送表,其中数据以编程方式“推送”到表。
计算表,其中数据来自 DAX 表达式,该表达式引用模型中的另一个对象作为其数据。
在下面的代码示例中,我们将定义一个常规表。
必需元素
一个表必须至少有一个分区。 常规表还必须至少定义了一个列。
每个分区都必须有一个指定数据来源的 Source,但 source 可以设置为 null。 通常,源是使用相关数据库查询语言定义数据切片的查询表达式。
代码示例:创建表、列、分区
表由 Microsoft.AnalysisServices.Tabular 命名空间) 中的 Table 类 (表示。
在下面的示例中,我们将定义一个常规表,其中包含一个链接到关系数据源的分区和几个常规列。 我们还会将更改提交到服务器,并触发将数据引入模型的数据刷新。 这是要将数据从SQL Server关系数据库加载到表格解决方案的最典型方案。
using System;
using Microsoft.AnalysisServices;
using Microsoft.AnalysisServices.Tabular;
namespace TOMSamples
{
class Program
{
static void Main(string[] args)
{
//
// Connect to the local default instance of Analysis Services
//
string ConnectionString = "DataSource=localhost";
//
// The using syntax ensures the correct use of the
// Microsoft.AnalysisServices.Tabular.Server object.
//
using (Server server = new Server())
{
server.Connect(ConnectionString);
//
// Generate a new database name and use GetNewName
// to ensure the database name is unique.
//
string newDatabaseName =
server.Databases.GetNewName("Database with a Table Definition");
//
// Instantiate a new
// Microsoft.AnalysisServices.Tabular.Database object.
//
var dbWithTable = new Database()
{
Name = newDatabaseName,
ID = newDatabaseName,
CompatibilityLevel = 1200,
StorageEngineUsed = StorageEngineUsed.TabularMetadata,
};
//
// Add a Microsoft.AnalysisServices.Tabular.Model object to the
// database, which acts as a root for all other Tabular metadata objects.
//
dbWithTable.Model = new Model()
{
Name = "Tabular Data Model",
Description = "A Tabular data model at the 1200 compatibility level."
};
//
// Add a Microsoft.AnalysisServices.Tabular.ProviderDataSource object
// to the data Model object created in the previous step. The connection
// string of the data source object in this example
// points to an instance of the AdventureWorks2014 SQL Server database.
//
string dataSourceName = "SQL Server Data Source Example";
dbWithTable.Model.DataSources.Add(new ProviderDataSource()
{
Name = dataSourceName,
Description = "A data source definition that uses explicit Windows credentials for authentication against SQL Server.",
ConnectionString = "Provider=SQLNCLI11;Data Source=localhost;Initial Catalog=AdventureWorks2014;Integrated Security=SSPI;Persist Security Info=false",
ImpersonationMode = Microsoft.AnalysisServices.Tabular.ImpersonationMode.ImpersonateAccount,
Account = @".\Administrator",
Password = "P@ssw0rd",
});
//
// Add a table called Individual Customers to the data model
// with a partition that points to a [Sales].[vIndividualCustomer] view
// in the underlying data source.
//
dbWithTable.Model.Tables.Add(new Table()
{
Name = dbWithTable.Model.Tables.GetNewName("Individual Customers"),
Description = "Individual customers (names and email addresses) that purchase Adventure Works Cycles products online.",
Partitions = {
//
// Create a single partition with a QueryPartitionSource for a query
// that imports all customer rows from the underlying data source.
//
new Partition() {
Name = "All Customers",
Source = new QueryPartitionSource() {
DataSource = dbWithTable.Model.DataSources[dataSourceName],
Query = @"SELECT [FirstName]
,[MiddleName]
,[LastName]
,[PhoneNumber]
,[EmailAddress]
,[City]
FROM [Sales].[vIndividualCustomer]",
}
}
},
Columns =
{
//
// DataColumn objects refer to regular table columns.
// Each DataColumn object corresponds to a column in the underlying data source query.
//
new DataColumn() {
Name = "FirstName",
DataType = DataType.String,
SourceColumn = "FirstName",
},
new DataColumn() {
Name = "MiddleName",
DataType = DataType.String,
SourceColumn = "MiddleName",
},
new DataColumn() {
Name = "LastName",
DataType = DataType.String,
SourceColumn = "LastName",
},
new DataColumn() {
Name = "PhoneNumber",
DataType = DataType.String,
SourceColumn = "PhoneNumber",
},
new DataColumn() {
Name = "EmailAddress",
DataType = DataType.String,
SourceColumn = "EmailAddress",
},
new DataColumn() {
Name = "City",
DataType = DataType.String,
SourceColumn = "City",
},
}
});
//
// Add the new database object to the server's
// Databases connection and submit the changes
// with full expansion to the server.
//
server.Databases.Add(dbWithTable);
//
// Request a full refresh to import the data from the data source and
// and perform any necessary recalculations.
// The refresh operation will be performed with the next
// invocation of Model.SaveChanges() or Database.Update(UpdateOptions.ExpandFull).
dbWithTable.Model.RequestRefresh(Microsoft.AnalysisServices.Tabular.RefreshType.Full);
dbWithTable.Update(UpdateOptions.ExpandFull);
Console.Write("Database ");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write(dbWithTable.Name);
Console.ResetColor();
Console.WriteLine(" created successfully.");
Console.WriteLine("The data model includes the following table definitions:");
Console.ForegroundColor = ConsoleColor.Yellow;
foreach (Table tbl in dbWithTable.Model.Tables)
{
Console.WriteLine("\tTable name:\t\t{0}", tbl.Name);
Console.WriteLine("\ttbl description:\t{0}", tbl.Description);
}
Console.ResetColor();
Console.WriteLine();
}
Console.WriteLine("Press Enter to close this console window.");
Console.ReadLine();
}
}
}
表中的分区
分区由 Microsoft.AnalysisServices.Tabular 命名空间) 中的 Partition 类 (表示。 Partition 类公开 PartitionSource 类型的 Source 属性,该属性针对将数据引入分区的不同方法提供抽象。 Partition 实例可以将 Source 属性设置为 null,指示数据将通过将数据区块作为 Analysis Services 公开的推送数据 API 的一部分发送到服务器来推送到分区中。 在 SQL Server 2016 中,PartitionSource 类有两个派生类,表示将数据绑定到分区的方法:QueryPartitionSource 和 CalculatedPartitionSource。
表中的列
列由从 Microsoft.AnalysisServices.Tabular 命名空间) 中 (基 Column 类派生的多个类表示:
- 常规表中常规列的 DataColumn ()
- DAX 表达式) 支持的列的 CalculatedColumn (
- 计算表中常规列的 CalculatedTableColumn ()
- RowNumberColumn (SSAS 为每个表) 创建的特殊类型的列。
表中的行号
服务器上的每个 Table 对象都有一个 RowNumberColumn ,用于编制索引。 无法显式创建或添加它。 保存或更新对象时,将自动创建列:
Db。SaveChanges
Db。Update (ExpandFull)
调用任一方法时,服务器将自动创建行号列,该列将作为 RowNumberColumn 表的 Columns 集合可见。
计算表
计算表源自 DAX 表达式,该表达式重新使用模型中现有数据结构中的数据或从外部绑定。 若要以编程方式创建计算表,请执行以下操作:
创建泛型 表。
使用 CalculatedPartitionSource 类型的源向其添加分区,其中 source 是 DAX 表达式。 分区的源是将常规表与计算表区分开来的源。
将更改保存到服务器时,服务器将返回 CalculatedTableColumns 的推断列表, (计算表由) 计算表列组成,可通过表的 Columns 集合查看。
后续步骤
查看用于处理 TOM 中的异常的类: 处理 TOM 中的错误