表形式モデルでテーブル、パーティション、列を作成する

適用対象:SQL Server 2016 以降の Analysis Services Azure Analysis Services Fabric/Power BI Premium

表形式モデルでは、テーブルは行と列で構成されます。 行はパーティションに編成され、増分データ更新をサポートします。 表形式ソリューションでは、データの取得元に応じて、いくつかの種類のテーブルをサポートできます。

  • データプロバイダーを介してリレーショナル データ ソースからデータが生成される通常のテーブル。

  • プッシュされたテーブル。データはプログラムによってテーブルに "プッシュ" されます。

  • 計算テーブル。データは、データのモデル内の別のオブジェクトを参照する DAX 式から取得されます。

次のコード例では、標準テーブルを定義します。

必須の要素

テーブルには少なくとも 1 つのパーティションが必要です。 通常のテーブルには、少なくとも 1 つの列が定義されている必要があります。

すべてのパーティションには、データの配信元を指定する Source が必要ですが、source は null に設定できます。 通常、ソースは、関連するデータベース クエリ言語でデータのスライスを定義するクエリ式です。

コード例: テーブル、列、パーティションを作成する

テーブルは Table クラス (Microsoft.AnalysisServices.Tabular 名前空間) で表されます。

次の例では、リレーショナル データ ソースに 1 つのパーティションをリンクし、いくつかの通常の列を持つ標準テーブルを定義します。 また、サーバーに変更を送信し、データをモデルに取り込むデータ更新をトリガーします。 これは、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(); 
        } 
    } 
} 

テーブル内のパーティション

パーティションは 、Partition クラス (Microsoft.AnalysisServices.Tabular 名前空間内) で表されます。 Partition クラスは、PartitionSource 型の Source プロパティを公開します。これにより、パーティションにデータを取り込むさまざまなアプローチを抽象化できます。 Partition インスタンスには Source プロパティを null として設定できます。これは、Analysis Services によって公開されるプッシュ データ API の一部として、データのチャンクをサーバーに送信することで、データがパーティションにプッシュされることを示します。 SQL Server 2016 では、PartitionSource クラスには、データをパーティションにバインドする方法を表す 2 つの派生クラス (QueryPartitionSourceCalculatedPartitionSource) があります

テーブル内の列

列は、基本 Column クラス (Microsoft.AnalysisServices.Tabular 名前空間) から派生した複数のクラスによって表されます。

  • DataColumn (標準テーブルの通常の列の場合)
  • CalculatedColumn (DAX 式でサポートされる列の場合)
  • CalculatedTableColumn (計算テーブルの通常の列の場合)
  • RowNumberColumn (すべてのテーブルに対して SSAS によって作成された列の特殊な型)。

テーブル内の行番号

サーバー上のすべての Table オブジェクトには、インデックス作成のために使用される RowNumberColumn があります。 明示的に作成または追加することはできません。 列は、オブジェクトを保存または更新すると自動的に作成されます。

  • Db。Savechanges

  • Db。Update(ExpandFull)

いずれかのメソッドを呼び出すと、サーバーによって行番号列が自動的に作成され、テーブルの Columns コレクションが RowNumberColumn として表示されます。

計算テーブル

計算テーブルは、モデル内の既存のデータ構造または行外バインディングからデータを再利用する DAX 式からソース化されます。 プログラムで計算テーブルを作成するには、次の操作を行います。

  • 汎用テーブルを作成 します

  • ソースが DAX 式である CalculatedPartitionSource 型の Source を使用してパーティションを追加します。 パーティションのソースは、通常のテーブルと計算テーブルを区別するソースです。

サーバーに変更を保存すると、サーバーは、テーブルの Columns コレクションを介して表示される CalculatedTableColumns (計算テーブルは計算テーブル列で構成されます) の推定リストを返します。

次のステップ

TOM で例外を処理するために使用されるクラスを確認する: TOM でのエラーの処理