다음을 통해 공유


테이블 형식 모델로 테이블, 파티션 및 열 만들기

적용 대상: SQL Server 2016 이상 Analysis Services Azure Analysis Services Fabric/Power BI Premium

테이블 형식 모델에서 테이블은 행과 열로 구성됩니다. 행은 증분 데이터 새로 고침을 지원하기 위해 파티션으로 구성됩니다. 테이블 형식 솔루션은 데이터의 원본 위치에 따라 여러 유형의 테이블을 지원할 수 있습니다.

  • 데이터 공급자를 통해 관계형 데이터 원본에서 데이터가 시작되는 일반 테이블입니다.

  • 데이터가 프로그래밍 방식으로 테이블에 "푸시"되는 푸시된 테이블입니다.

  • 계산된 테이블입니다. 여기서 데이터는 해당 데이터에 대한 모델 내의 다른 개체를 참조하는 DAX 식에서 가져옵니다.

아래 코드 예제에서는 일반 테이블을 정의합니다.

필수 요소

테이블에 파티션이 하나 이상 있어야 합니다. 또한 일반 테이블에는 하나 이상의 열이 정의되어야 합니다.

모든 파티션에는 데이터의 원본을 지정하는 Source가 있어야 하지만 원본은 null로 설정할 수 있습니다. 일반적으로 원본은 관련 데이터베이스 쿼리 언어의 데이터 조각을 정의하는 쿼리 식입니다.

코드 예제: 테이블, 열, 파티션 만들기

테이블은 Table 클래스(Microsoft.AnalysisServices.Tabular 네임스페이스)로 표시됩니다.

아래 예제에서는 하나의 파티션이 관계형 데이터 원본과 몇 개의 일반 열에 연결된 일반 테이블을 정의합니다. 또한 변경 내용을 서버에 제출하고 데이터를 모델로 가져오는 데이터 새로 고침을 트리거합니다. 이는 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 클래스는 데이터를 파티션으로 수집하기 위한 다양한 방법에 대한 추상화 기능을 제공하는 PartitionSource 형식의 Source 속성을 노출합니다. 파티션 instance Source 속성을 null로 사용할 수 있습니다. 이는 Analysis Services에서 노출하는 푸시 데이터 API의 일부로 서버로 데이터 청크를 전송하여 데이터가 파티션으로 푸시됨을 나타냅니다. 2016년 SQL Server PartitionSource 클래스에는 데이터를 파티션에 바인딩하는 방법을 나타내는 두 개의 파생 클래스인 QueryPartitionSourceCalculatedPartitionSource가 있습니다.

테이블의 열

열은 기본 Column 클래스(Microsoft.AnalysisServices.Tabular 네임스페이스)에서 파생된 여러 클래스로 표시됩니다.

  • DataColumn (일반 테이블의 일반 열용)
  • CalculatedColumn (DAX 식으로 백업되는 열의 경우)
  • CalculatedTableColumn (계산 테이블의 일반 열용)
  • RowNumberColumn (모든 테이블에 대해 SSAS에서 만든 특수 열 형식).

테이블의 행 번호

서버의 모든 Table 개체에는 인덱싱 목적으로 사용되는 RowNumberColumn 이 있습니다. 명시적으로 만들거나 추가할 수 없습니다. 개체를 저장하거나 업데이트하면 열이 자동으로 만들어집니다.

  • Db. Savechanges

  • Db. Update(ExpandFull)

두 메서드 중 하나를 호출할 때 서버는 행 번호 열을 자동으로 만듭니다. 이 열은 테이블의 Columns 컬렉션 에 RowNumberColumn 으로 표시됩니다.

계산된 테이블

계산된 테이블은 모델의 기존 데이터 구조 또는 아웃 오브 라인 바인딩에서 데이터를 다시 사용하는 DAX 식에서 제공됩니다. 프로그래밍 방식으로 계산 테이블을 만들려면 다음을 수행합니다.

  • 제네릭 테이블을 만듭니다.

  • Source가 DAX 식인 CalculatedPartitionSource 형식의 Source를 사용하여 파티션을 추가합니다. 파티션의 원본은 계산된 테이블과 일반 테이블을 구분하는 것입니다.

서버에 변경 내용을 저장하면 서버는 테이블의 Columns 컬렉션을 통해 표시되는 CalculatedTableColumns (계산 테이블은 계산 테이블 열로 구성됨)의 유추된 목록을 반환합니다.

다음 단계

TOM: TOM에서 오류 처리에서 예외 처리하는 데 사용되는 클래스를 검토합니다.