Integration Services 패키지의 MERGEMERGE in Integration Services Packages

SQL ServerSQL Server Integration ServicesIntegration Services의 현재 릴리스에서 SQL 실행 태스크의 SQL 문은 MERGE 문을 포함할 수 있습니다.In the current release of SQL ServerSQL Server Integration ServicesIntegration Services, the SQL statement in an Execute SQL task can contain a MERGE statement. 이 MERGE 문을 사용하면 하나의 문에서 여러 INSERT, UPDATE 및 DELETE 작업을 수행할 수 있습니다.This MERGE statement enables you to accomplish multiple INSERT, UPDATE, and DELETE operations in a single statement.

패키지에서 MERGE 문을 사용하려면 다음 단계를 따르세요.To use the MERGE statement in a package, follow these steps:

  • 원본 데이터를 로드하고 변환하여 임시 또는 준비 테이블에 저장하는 데이터 흐름 태스크를 만듭니다.Create a Data Flow task that loads, transforms, and saves the source data to a temporary or staging table.

  • MERGE 문을 포함하는 SQL 실행 태스크를 만듭니다.Create an Execute SQL task that contains the MERGE statement.

  • 데이터 흐름 태스크를 SQL 실행 태스크에 연결하고 준비 테이블의 데이터를 MERGE 문의 입력으로 사용합니다.Connect the Data Flow task to the Execute SQL task, and use the data in the staging table as the input for the MERGE statement.

    참고

    이 시나리오의 MERGE 문에는 일반적으로 준비 테이블이 필요하지만 MERGE 문의 성능은 대개 조회 변환에 의해 수행되는 행 단위 조회보다 뛰어납니다.Although a MERGE statement typically requires a staging table in this scenario, the performance of the MERGE statement usually exceeds that of the row-by-row lookup performed by the Lookup transformation. 또한 MERGE는 대용량 조회 테이블이 조회 변환에서 참조 테이블을 캐시하는 데 사용할 수 있는 메모리를 테스트하는 경우 유용합니다.MERGE is also useful when the large size of a lookup table would test the memory that is available to the Lookup transformation for caching its reference table.

    MERGE 문 사용을 지원하는 예제 대상 구성 요소는 CodePlex 커뮤니티 예제 MERGE 대상(MERGE Destination)을 참조하세요.For a sample destination component that supports the use of the MERGE statement, see the CodePlex community sample, MERGE Destination.

MERGE 사용Using MERGE

일반적으로 삽입, 업데이트 및 삭제가 포함된 한 테이블의 변경을 다른 테이블에 적용하려는 경우 MERGE 문을 사용합니다.Typically, you use the MERGE statement when you want to apply changes that include inserts, updates, and deletions from one table to another table. SQL Server 2008SQL Server 2008전에는 이 프로세스에 조회 변환과 여러 OLE DB 명령 변환이 모두 필요했습니다.Prior to SQL Server 2008SQL Server 2008, this process required both a Lookup transformation and multiple OLE DB Command transformations. 조회 변환은 행 단위로 조회를 수행하여 각 행이 새로운 행인지 변경된 행인지를 판단했습니다.The Lookup transformation performed a row-by-row lookup to determine whether each row was new or changed. 그러면 OLE DB 명령 변환이 필요한 INSERT, UPDATE 및 DELETE 작업을 수행했습니다.The OLE DB Command transformations then performed the necessary INSERT, UPDATE, and DELETE operations. SQL Server 2008SQL Server 2008이상에서는 하나의 MERGE 문이 조회 변환과 이에 해당하는 OLE DB 명령 변환을 대체합니다.Beginning in SQL Server 2008SQL Server 2008, a single MERGE statement can replace both the Lookup transformation and the corresponding OLE DB Command transformations.

증분 로드와의 MERGEMERGE with Incremental Loads

SQL Server 2008SQL Server 2008 의 새로운 변경 데이터 캡처 기능을 사용하면 데이터 웨어하우스로 증분 로드를 보다 쉽게, 안정적으로 수행할 수 있습니다.The change data capture functionality that is new in SQL Server 2008SQL Server 2008 makes it easier to perform incremental loads reliably to a data warehouse. 삽입과 업데이트를 수행하기 위해 매개 변수가 있는 OLE DB 명령 변환을 사용하는 대신 MERGE 문을 사용하여 두 작업을 결합할 수 있습니다.As an alternative to using parameterized OLE DB Command transformations to perform the inserts and the updates, you can use the MERGE statement to combine both operations.

자세한 내용은 대상에 변경 내용 적용을 참조하세요.For more information, see Apply the Changes to the Destination.

다른 시나리오에서의 MERGEMERGE in Other Scenarios

다음 시나리오에서는 Integration ServicesIntegration Services 패키지 외부 또는 내부에서 MERGE 문을 사용할 수 있습니다.In the following scenarios, you can use the MERGE statement either outside or inside an Integration ServicesIntegration Services package. 그러나 대부분의 경우 Integration ServicesIntegration Services 패키지는 다른 유형의 여러 원본에서 이 데이터를 로드한 후 결합하고 정리해야 합니다.However, an Integration ServicesIntegration Services package is often required to load this data from multiple heterogeneous sources, and then to combine and cleanse the data. 따라서 쉽고 간단한 유지 관리를 위해 패키지에서 MERGE 문을 사용하는 방법을 고려할 수 있습니다.Therefore, you might consider using the MERGE statement in a package for convenience and ease of maintenance.

구매 습관 추적Track Buying Habits

데이터 웨어하우스의 FactBuyingHabits 테이블은 고객이 특정 제품을 구매한 마지막 날짜를 추적합니다.The FactBuyingHabits table in the data warehouse tracks the last date on which a customer bought a given product. 테이블은 ProductID, CustomerID 및 PurchaseDate 열로 구성됩니다.The table consists of ProductID, CustomerID and PurchaseDate columns. 매주 트랜잭션 데이터베이스는 해당 주 동안 이루어진 구매를 포함하는 PurchaseRecords 테이블을 생성합니다.Every week, the transactional database generates a PurchaseRecords table that includes the purchases made during that week. 목표는 하나의 MERGE 문을 사용하여 PurchaseRecords 테이블의 정보를 FactBuyingHabits 테이블로 병합하는 것입니다.The objective is to use a single MERGE statement to merge the information in the PurchaseRecords table into the FactBuyingHabits table. MERGE 문은 존재하지 않는 제품-고객 쌍에 대해 새 행을 삽입하고,For product-customer pairs that do not exist, the MERGE statement inserts new rows. 존재하는 제품-고객 쌍에 대한 최근 구매 날짜를 업데이트합니다.For product-customer pairs that exist, the MERGE statement updates the most recent date-of-purchase.

가격 기록 추적Track Price History

DimBook 테이블은 서점에 재고가 있는 책 목록을 나타내고 각 책의 가격 기록을 식별합니다.The DimBook table represents the list of books in the inventory of a book seller and identifies the price history of each book. 이 테이블에는 ISBN, ProductID, Price, Shelf 및 IsCurrent 열이 있습니다.This table has these columns: ISBN, ProductID, Price, Shelf, and IsCurrent. 또한 이 테이블에는 책의 각 가격에 대한 행이 하나씩 있습니다.This table also has one row for each price the book has had. 이러한 여러 행 중 하나에 현재 가격이 포함됩니다.One of these rows contains the current price. 현재 가격이 포함된 행을 나타내기 위해 해당 행에 대한 IsCurrent 열의 값이 1로 설정됩니다.To indicate which row contains the current price, the value of the IsCurrent column for that row is set to 1.

매주 데이터베이스는 해당 주의 가격 변동과 주 동안 추가된 새 책을 포함하는 WeeklyChanges 테이블을 생성합니다.Every week, the database generates a WeeklyChanges table that contains price changes for the week and new books that were added during the week. 하나의 MERGE 문을 사용하여 WeeklyChanges 테이블의 변경 사항을 DimBook 테이블에 적용할 수 있습니다.By using a single MERGE statement, you can apply the changes in the WeeklyChanges table to the DimBook table. MERGE 문은 새로 추가된 책에 대해 새 행을 삽입하고, 가격이 변경된 기존 책의 행에 대한 IsCurrent 열을 0으로 업데이트합니다.The MERGE statement inserts new rows for newly-added books, and updates the IsCurrent column to 0 for rows of existing books whose prices have changed. 또한 MERGE 문은 가격이 변경된 책에 대해 새 행을 삽입하고, 삽입된 새 행에 대해 IsCurrent 열의 값을 1로 설정합니다.The MERGE statement also inserts new rows for books whose prices have changed, and for these new rows, sets the value of the IsCurrent column to 1.

새 데이터가 있는 테이블을 기존 테이블에 병합Merge a Table with New Data Against the Old Table

데이터베이스는 “개방형 스키마”, 즉 각 속성에 대한 이름-값 쌍을 포함하는 테이블을 사용하여 개체의 속성을 모델링합니다.The database models the properties of an object by using an “open schema,” that is, a table contains name-value pairs for each property. 속성 테이블에는 EntityID, PropertyID 및 Value의 3개 열이 있습니다.The Properties table has three columns: EntityID, PropertyID, and Value. 이 테이블의 새로운 버전인 NewProperties 테이블은 Properties 테이블과 동기화되어야 합니다.A NewProperties table that is a newer version of the table has to be synchronized with the Properties table. 이 두 테이블을 동기화하려면 하나의 MERGE 문을 사용하여 다음 작업을 수행하면 됩니다.To synchronize these two tables, you can use a single MERGE statement to perform the following operations:

  • NewProperties 테이블에 없는 속성을 Properties 테이블에서 삭제합니다.Delete properties from the Properties table if they are absent from the NewProperties table.

  • Properties 테이블의 속성 값을 NewProperties 테이블의 새 값으로 업데이트합니다.Update values for properties that are in the Properties table with new values found in the NewProperties table.

  • NewProperties 테이블에는 있지만 Properties 테이블에는 없는 속성에 대한 새 속성을 삽입합니다.Insert new properties for properties that are in the NewProperties table but are not found in the Properties table.

    이 방식은 서버 두 대에 있는 두 테이블의 데이터를 동기화된 상태로 유지하는 것이 목적인 복제 시나리오와 비슷한 시나리오에서 유용합니다.This approach is useful in scenarios that resemble replication scenarios, where the objective is to keep data in two tables on two servers synchronized.

재고 추적Track Inventory

Inventory 데이터베이스의 ProductsInventory 테이블에는 ProductID와 StockOnHand 열이 있습니다.The Inventory database has a ProductsInventory table that has ProductID and StockOnHand columns. ProductID, CustomerID 및 Quantity 열이 있는 Shipments 테이블은 고객에게 보내는 제품 배송을 추적합니다.A Shipments table with ProductID, CustomerID, and Quantity columns tracks shipments of products to customers. ProductInventory 테이블은 Shipments 테이블의 정보를 바탕으로 매일 업데이트되어야 합니다.The ProductInventory table has to be updated daily based on information in the Shipments table. 하나의 MERGE 문은 배송을 기준으로 ProductInventory 테이블의 재고를 줄일 수 있습니다.A single MERGE statement can reduce the inventory in the ProductInventory table based on the shipments made. 또한 제품에 대한 재고가 0이 되면 이 MERGE 문은 ProductInventory 테이블에서 해당 제품 행을 삭제할 수도 있습니다.If the inventory for a product has been reduced to 0, that MERGE statement can also delete that product row from the ProductInventory table.