MERGE in Integration Services PackagesMERGE in Integration Services Packages

Nella versione corrente di SQL ServerSQL Server Integration ServicesIntegration Servicesl'istruzione SQL in un'attività Esegui SQL può contenere un'istruzione 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. che consente di eseguire più operazioni INSERT, UPDATE e DELETE in una singola istruzione.This MERGE statement enables you to accomplish multiple INSERT, UPDATE, and DELETE operations in a single statement.

Per utilizzare l'istruzione MERGE in un pacchetto, effettuare le operazioni seguenti:To use the MERGE statement in a package, follow these steps:

  • Creare un'attività Flusso di dati per caricare, trasformare e salvare l'origine dati in una tabella temporanea o di gestione temporanea.Create a Data Flow task that loads, transforms, and saves the source data to a temporary or staging table.

  • Creare un'attività Esegui SQL contenente l'istruzione MERGE.Create an Execute SQL task that contains the MERGE statement.

  • Connettere l'attività Flusso di dati all'attività Esegui SQL e utilizzare i dati della tabella di gestione temporanea come input per l'istruzione 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.

    Nota

    Anche se un'istruzione MERGE richiede in genere una tabella di gestione temporanea in questo scenario, le prestazioni dell'istruzione MERGE sono solitamente superiori a quelle della ricerca riga per riga eseguita con la trasformazione Ricerca.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 risulta utile anche quando, a causa delle dimensioni elevate di una tabella di ricerca, viene verificata la memoria a disposizione della trasformazione Ricerca per la memorizzazione nella cache della relativa tabella di riferimento.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.

    Per un componente di destinazione di esempio che supporta l'utilizzo dell'istruzione MERGE, vedere l'esempio nella community CodePlex relativo alla destinazione MERGE.For a sample destination component that supports the use of the MERGE statement, see the CodePlex community sample, MERGE Destination.

Utilizzo di MERGEUsing MERGE

In genere, si utilizza l'istruzione MERGE quando si desidera applicare modifiche quali inserimenti, aggiornamenti ed eliminazioni da una tabella a un'altra.Typically, you use the MERGE statement when you want to apply changes that include inserts, updates, and deletions from one table to another table. Prima di SQL Server 2008SQL Server 2008, per eseguire questo processo erano necessarie una trasformazione Ricerca e più trasformazioni Comando OLE DB.Prior to SQL Server 2008SQL Server 2008, this process required both a Lookup transformation and multiple OLE DB Command transformations. Con la trasformazione Ricerca veniva eseguita una ricerca riga per riga per determinare se ogni riga era nuova o era stata modificata.The Lookup transformation performed a row-by-row lookup to determine whether each row was new or changed. Con la trasformazione Comando OLE DB venivano quindi eseguite tutte le necessarie operazioni INSERT, UPDATE e DELETE.The OLE DB Command transformations then performed the necessary INSERT, UPDATE, and DELETE operations. A partire da SQL Server 2008SQL Server 2008una singola istruzione MERGE può sostituire sia la trasformazione Ricerca sia le trasformazioni Comando OLE DB corrispondenti.Beginning in SQL Server 2008SQL Server 2008, a single MERGE statement can replace both the Lookup transformation and the corresponding OLE DB Command transformations.

MERGE con caricamenti incrementaliMERGE with Incremental Loads

La funzionalità Change Data Capture, una novità di SQL Server 2008SQL Server 2008 , rende più affidabile l'esecuzione di caricamenti incrementali in un data warehouse.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. Come alternativa all'utilizzo di trasformazioni Comando OLE DB con parametri per l'esecuzione di inserimenti e aggiornamenti, è possibile utilizzare l'istruzione MERGE per combinare le due operazioni.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.

Per altre informazioni, vedere Applicazione delle modifiche alla destinazione.For more information, see Apply the Changes to the Destination.

MERGE in altri scenariMERGE in Other Scenarios

Negli scenari seguenti è possibile utilizzare l'istruzione MERGE all'esterno o all'interno di un pacchetto di Integration ServicesIntegration Services .In the following scenarios, you can use the MERGE statement either outside or inside an Integration ServicesIntegration Services package. Un pacchetto di Integration ServicesIntegration Services , tuttavia, è spesso richiesto per caricare questi dati da più origini eterogenee e quindi per combinare e pulire i dati.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. Pertanto, valutare la possibilità di utilizzare l'istruzione MERGE in un pacchetto per praticità e facilità di manutenzione.Therefore, you might consider using the MERGE statement in a package for convenience and ease of maintenance.

Rilevare le abitudini di acquistoTrack Buying Habits

Nella tabella FactBuyingHabits del data warehouse viene rilevata l'ultima data in cui un cliente ha acquistato un determinato prodotto.The FactBuyingHabits table in the data warehouse tracks the last date on which a customer bought a given product. La tabella è costituita dalle colonne ProductID, CustomerID e PurchaseDate.The table consists of ProductID, CustomerID and PurchaseDate columns. Ogni settimana, il database transazionale genera una tabella PurchaseRecords che include gli acquisti eseguiti durante tale settimana.Every week, the transactional database generates a PurchaseRecords table that includes the purchases made during that week. L'obiettivo è quello di utilizzare una singola istruzione MERGE per unire le informazioni della tabella PurchaseRecords nella tabella FactBuyingHabits.The objective is to use a single MERGE statement to merge the information in the PurchaseRecords table into the FactBuyingHabits table. Per le coppie prodotto-cliente che non esistono, l'istruzione MERGE inserisce nuove righe.For product-customer pairs that do not exist, the MERGE statement inserts new rows. Per le coppie prodotto-cliente che esistono, l'istruzione MERGE aggiorna la data di acquisto più recente.For product-customer pairs that exist, the MERGE statement updates the most recent date-of-purchase.

Rilevare la cronologia dei prezziTrack Price History

La tabella DimBook rappresenta l'elenco di libri nell'inventario di un libraio e identifica la cronologia dei prezzi di ogni libro.The DimBook table represents the list of books in the inventory of a book seller and identifies the price history of each book. La tabella contiene le colonne ISBN, ProductID, Price, Shelf e IsCurrent.This table has these columns: ISBN, ProductID, Price, Shelf, and IsCurrent. Include inoltre un'unica riga per ogni prezzo assegnato al libro.This table also has one row for each price the book has had. Una di queste righe contiene il prezzo corrente.One of these rows contains the current price. Per indicare quale riga contiene il prezzo corrente, il valore della colonna IsCurrent per tale riga è impostato su 1.To indicate which row contains the current price, the value of the IsCurrent column for that row is set to 1.

Ogni settimana, il database genera una tabella WeeklyChanges che contiene le modifiche di prezzo e i nuovi libri aggiunti durante la settimana.Every week, the database generates a WeeklyChanges table that contains price changes for the week and new books that were added during the week. Utilizzando una singola istruzione MERGE, è possibile applicare le modifiche della tabella WeeklyChanges alla tabella DimBook.By using a single MERGE statement, you can apply the changes in the WeeklyChanges table to the DimBook table. L'istruzione MERGE inserisce nuove righe per i libri appena aggiunti e imposta la colonna IsCurrent su 0 per le righe di libri esistenti il cui prezzo è stato modificato.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. Inserisce inoltre nuove righe per i libri il cui prezzo è stato modificato e, per queste nuove righe, imposta il valore della colonna IsCurrent su 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.

Unire una tabella contenente nuovi dati con la tabella precedenteMerge a Table with New Data Against the Old Table

Il database modella le proprietà di un oggetto utilizzando uno "schema aperto", ovvero una tabella contiene coppie nome-valore per ogni proprietà.The database models the properties of an object by using an “open schema,” that is, a table contains name-value pairs for each property. La tabella Properties contiene tre colonne: EntityID, PropertyID e Value.The Properties table has three columns: EntityID, PropertyID, and Value. È necessario sincronizzare una versione più recente della tabella, denominata NewProperties, con la tabella Properties.A NewProperties table that is a newer version of the table has to be synchronized with the Properties table. A tale scopo, è possibile utilizzare una singola istruzione MERGE per effettuare le operazioni seguenti:To synchronize these two tables, you can use a single MERGE statement to perform the following operations:

  • Eliminare proprietà dalla tabella Properties se non si trovano nella tabella NewProperties.Delete properties from the Properties table if they are absent from the NewProperties table.

  • Aggiornare i valori per le proprietà presenti nella tabella Properties con i nuovi valori della tabella NewProperties.Update values for properties that are in the Properties table with new values found in the NewProperties table.

  • Inserire nuove proprietà per le proprietà presenti nella tabella NewProperties ma che non si trovano nella tabella Properties.Insert new properties for properties that are in the NewProperties table but are not found in the Properties table.

    Questo approccio risulta utile negli scenari simili agli scenari di replica, in cui l'obiettivo è quello di mantenere sincronizzati i dati di due tabelle in due server.This approach is useful in scenarios that resemble replication scenarios, where the objective is to keep data in two tables on two servers synchronized.

Tenere traccia dell'inventarioTrack Inventory

Il database Inventory contiene una tabella ProductsInventory con le colonne ProductID e StockOnHand.The Inventory database has a ProductsInventory table that has ProductID and StockOnHand columns. In una tabella Shipments con le colonne ProductID, CustomerID e Quantity vengono rilevate le spedizioni di prodotti ai clienti.A Shipments table with ProductID, CustomerID, and Quantity columns tracks shipments of products to customers. La tabella ProductInventory deve essere aggiornata ogni giorno in base alle informazioni presenti nella tabella Shipments.The ProductInventory table has to be updated daily based on information in the Shipments table. Con una singola istruzione MERGE è possibile ridurre l'inventario nella tabella ProductInventory in base alle spedizioni effettuate.A single MERGE statement can reduce the inventory in the ProductInventory table based on the shipments made. Se l'inventario per un prodotto è stato ridotto a 0, con l'istruzione MERGE è possibile eliminare anche la riga di tale prodotto dalla tabella 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.