在表格模型中创建表格、分区和列

适用于: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 类有两个派生类,表示将数据绑定到分区的方法:QueryPartitionSourceCalculatedPartitionSource

表中的列

列由从 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 中的错误