Bagikan melalui


Membuat Tabel, Partisi, dan Kolom dalam model Tabular

Berlaku untuk: SQL Server 2016 dan yang lebih baru Analysis Services Azure Analysis Services Fabric/Power BI Premium

Dalam model tabular, tabel terdiri dari baris dan kolom. Baris diatur ke dalam partisi untuk mendukung refresh data inkremental. Solusi tabular dapat mendukung beberapa jenis tabel, tergantung dari mana data berasal:

  • Tabel reguler, tempat data berasal dari sumber data relasional, melalui penyedia data.

  • Tabel yang didorong, di mana data "didorong" ke tabel secara terprogram.

  • Tabel terhitung, di mana data berasal dari ekspresi DAX yang mereferensikan objek lain dalam model untuk datanya.

Dalam contoh kode di bawah ini, kita akan menentukan tabel reguler.

Elemen yang diperlukan

Tabel harus memiliki setidaknya satu partisi. Tabel reguler juga harus memiliki setidaknya satu kolom yang ditentukan.

Setiap partisi harus memiliki Sumber yang menentukan asal data, tetapi sumber dapat diatur ke null. Biasanya, sumbernya adalah ekspresi kueri yang menentukan iringan data dalam bahasa kueri database yang relevan.

Contoh kode: membuat Tabel, Kolom, Partisi

Tabel diwakili oleh kelas Tabel (dalam namespace Microsoft.AnalysisServices.Tabular).

Dalam contoh di bawah ini, kita akan menentukan tabel reguler yang memiliki satu partisi yang ditautkan ke sumber data relasional dan beberapa kolom reguler. Kami juga akan mengirimkan perubahan ke server dan memicu refresh data yang membawa data ke dalam model. Ini mewakili skenario paling umum ketika Anda ingin memuat data dari database relasional SQL Server ke dalam solusi Tabular.

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(); 
        } 
    } 
} 

Partisi dalam tabel

Partisi diwakili oleh kelas Partisi (dalam namespace Microsoft.AnalysisServices.Tabular). Kelas Partisi mengekspos properti Sumber dari jenis PartitionSource , yang menyediakan abstraksi atas berbagai pendekatan untuk menyerap data ke dalam partisi. Instans Partisi dapat memiliki properti Sumber sebagai null, menunjukkan bahwa data akan didorong ke partisi dengan mengirim potongan data ke Server sebagai bagian dari API data push yang diekspos oleh Analysis Services. Pada SQL Server 2016, kelas PartitionSource memiliki dua kelas turunan yang mewakili cara untuk mengikat data ke partisi: QueryPartitionSource dan CalculatedPartitionSource.

Kolom dalam tabel

Kolom diwakili oleh beberapa kelas yang berasal dari kelas Kolom dasar (di namespace Microsoft.AnalysisServices.Tabular):

  • DataColumn (untuk kolom reguler dalam tabel reguler)
  • CalculatedColumn (untuk kolom yang didukung oleh ekspresi DAX)
  • CalculatedTableColumn (untuk kolom reguler dalam tabel terhitung)
  • RowNumberColumn (jenis kolom khusus yang dibuat oleh SSAS untuk setiap tabel).

Nomor baris dalam tabel

Setiap objek Tabel di server memiliki RowNumberColumn yang digunakan untuk tujuan pengindeksan. Anda tidak dapat membuat atau menambahkannya secara eksplisit. Kolom dibuat secara otomatis saat Anda menyimpan atau memperbarui objek:

  • Db. SaveChanges

  • Db. Update(ExpandFull)

Saat memanggil salah satu metode, server akan membuat kolom nomor baris secara otomatis, yang akan terlihat sebagai RowNumberColumn koleksi Kolom tabel.

Tabel terhitung

Tabel terhitung bersumber dari ekspresi DAX yang bertujuan ulang data dari struktur data yang ada dalam model atau dari pengikatan di luar baris. Untuk membuat tabel terhitung secara terprogram, lakukan hal berikut:

  • Membuat Tabel generik.

  • Tambahkan partisi ke dalamnya dengan Sumber jenis CalculatedPartitionSource, di mana sumbernya adalah ekspresi DAX. Sumber partisi adalah apa yang membedakan tabel biasa dari tabel terhitung.

Saat Anda menyimpan perubahan ke server, server akan mengembalikan daftar calculatedTableColumns yang disimpulkan (tabel terhitung terdiri dari kolom tabel terhitung), terlihat melalui kumpulan Kolom tabel.

Langkah selanjutnya

Tinjau kelas yang digunakan untuk menangani pengecualian di TOM: Menangani kesalahan di TOM