- 20/08/2019
- 25 minuti per la lettura
-
- X
- c
- j
- r
- a
-
+18
Si applica a: SQL Server (tutte le versioni supportate) Database SQL di Azure Azure Synapse Analytics
Esegue operazioni di inserimento, aggiornamento o eliminazione su una tabella di destinazione da i risultati di un join con una tabella di origine. Ad esempio, sincronizza due tabelle inserendo, aggiornando o eliminando righe in una tabella in base alle differenze trovate nellaltra tabella.
Nota
MERGE è attualmente in anteprima per Azure Synapse Analytics.
Suggerimento per le prestazioni: il comportamento condizionale descritto per listruzione MERGE funziona meglio quando le due tabelle hanno una combinazione complessa di caratteristiche di corrispondenza. Ad esempio, inserendo una riga se non esiste o aggiornando una riga se corrisponde. Quando si aggiorna semplicemente una tabella in base alle righe di unaltra tabella, migliorare le prestazioni e la scalabilità con le istruzioni INSERT, UPDATE e DELETE di base. Per esempio:
Convenzioni della sintassi Transact-SQL
Sintassi
Nota
Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere la documentazione delle versioni precedenti.
Argomenti
WITH < common_table_expression >
Specifica la vista o il set di risultati denominato temporaneo, noto anche come espressione di tabella comune, definito nellambito dellistruzione MERGE. Il set di risultati deriva da una semplice query ed è referenziato dallistruzione MERGE. Per ulteriori informazioni, vedere WITH common_table_expression (Transact-SQL).
TOP (espressione)
Specifica il numero o la percentuale di righe interessate. espressione può essere un numero o una percentuale delle righe. Le righe a cui si fa riferimento nellespressione TOP non sono disposte in alcun ordine. Per ulteriori informazioni, vedere TOP (Transact-SQL).
La clausola TOP si applica dopo che lintera tabella di origine e lintera tabella di destinazione si uniscono e le righe unite che non si qualificano per un inserimento, aggiornamento o le azioni di eliminazione vengono rimosse. La clausola TOP riduce ulteriormente il numero di righe unite al valore specificato. Le azioni di inserimento, aggiornamento o eliminazione si applicano alle restanti righe unite in modo non ordinato. Ovvero, non esiste un ordine in cui il le righe sono distribuite tra le azioni definite nelle clausole WHEN. Ad esempio, la specifica di TOP (10) influisce su 10 righe. Di queste righe, 7 possono essere aggiornate e 3 inserite, oppure 1 può essere cancellata, 5 aggiornata e 4 inserita e così via.
Poiché listruzione MERGE esegue una scansione completa della tabella sia dellorigine che tabelle di destinazione, le prestazioni di I / O sono a volte influenzate quando si utilizza la clausola TOP per modificare una tabella di grandi dimensioni creando più batch. In questo scenario, è importante assicurarsi che tutti i batch successivi abbiano come destinazione nuove righe.
database_name
Il nome del database in cui si trova target_table.
schema_name
Il nome dello schema a cui appartiene target_table.
target_table
La tabella o la vista rispetto alla quale le righe di dati da < table_source > vengono abbinate in base a < clausola_search_condition >. target_table è lobiettivo di qualsiasi operazione di inserimento, aggiornamento o eliminazione specificato dalle clausole WHEN dellistruzione MERGE.
Se target_table è una vista, qualsiasi azione contro di essa deve soddisfare le condizioni per laggiornamento delle viste. Per ulteriori informazioni, vedere Modifica dati tramite una vista.
target_table non può essere una tabella remota. target_table “non può avere regole definite su di esso.
table_alias
Un nome alternativo per fare riferimento a una tabella per target_table.
USING < table_source >
Specifica lorigine dati corrispondente alle righe di dati in target_table in base alla < merge_search condition >. Il risultato di questa corrispondenza determina le azioni da intraprendere dalle clausole WHEN dellistruzione MERGE. < table_source > può essere una tabella remota o una tabella derivata che accede a tabelle remote.
< table_source > può essere una tabella derivata che utilizza il costruttore di valori di tabella Transact-SQL per costruire una tabella specificando più righe.
table_alias
Un nome alternativo per fare riferimento a una tabella per table_source.
Per ulteriori informazioni sulla sintassi e sugli argomenti di questa clausola, vedere FROM (Transact-SQL).
ON < merge_search_condition >
Specifica le condizioni in cui < table_source > si unisce a target_table per determinare dove corrispondono.
Attenzione
È importante specificare solo le colonne della tabella di destinazione da utilizzare per scopi di corrispondenza. Ovvero, specificare le colonne della tabella di destinazione che vengono confrontate con la colonna corrispondente della tabella di origine. Non tentare di migliorare le prestazioni delle query filtrando le righe nella tabella di destinazione in la clausola ON; ad esempio, specificando AND NOT target_table.column_x = value
. In questo modo si potrebbero restituire risultati imprevisti e errati.
WHEN MATCHED THEN < merge_matched >
Specifica che tutte le righe di * target_table, che corrispondono alle righe restituite da < table_source > ON < merge_search_condition > e soddisfano qualsiasi condizione di ricerca aggiuntiva, vengono aggiornati o eliminati in base al < merge_matched > clausola.
Listruzione MERGE può avere al massimo due clausole WHEN MATCHED. Se vengono specificate due clausole, la prima clausola deve essere accompagnata da una clausola AND < search_condition >. Per una determinata riga, la seconda clausola WHEN MATCHED viene applicata solo se la prima non è “t. Se sono presenti due clausole WHEN MATCHED, una deve specificare unazione UPDATE e una deve specificare unazione DELETE. Quando UPDATE è specificato nel < merge_matched > clausola e più di una riga di < table_source > corrisponde a una riga in target_table in base a < merge_search_condition >, SQL Server restituisce un errore. Listruzione MERGE può” t aggiornare la stessa riga più di una volta oppure aggiornare ed eliminare la stessa riga.
QUANDO NON CORRISPONDE ALLORA < merge_not_matched >
Specifica che una riga viene inserita in target_table per ogni riga restituita da < table_source > ON < merge_search_condition > che non” t corrisponde a una riga in targ et_table, ma soddisfa una condizione di ricerca aggiuntiva, se presente. I valori da inserire sono specificati dalla clausola < merge_not_matched >. Listruzione MERGE può avere solo una clausola WHEN NOT MATCHED.
WHEN NOT MATCHED BY SOURCE THEN < merge_matched >
Specifica che tutte le righe di * target_table, che non corrispondono alle righe restituite da < table_source > ON < merge_search_condition > e che soddisfano qualsiasi condizione di ricerca aggiuntiva, vengono aggiornati o eliminati in base al < merge_matched > clausola.
Listruzione MERGE può avere al massimo due clausole WHEN NOT MATCHED BY SOURCE. Se vengono specificate due clausole, la prima clausola deve essere accompagnata da una clausola AND < clause_search_condition >. Per ogni riga, la seconda clausola WHEN NOT MATCHED BY SOURCE viene applicata solo se la prima non è ” t. Se sono presenti due clausole WHEN NOT MATCHED BY SOURCE, una deve specificare unazione UPDATE e laltra deve specificare unazione DELETE. È possibile fare riferimento solo alle colonne della tabella di destinazione in < clause_search_condition >.
Quando non vengono restituite righe da < table_source >, non è possibile accedere alle colonne nella tabella di origine. Se laggiornamento o lazione di eliminazione specificata in merge_matched > fa riferimento a colonne nella tabella di origine, viene restituito lerrore 207 (nome colonna non valido). Ad esempio, la clausola WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
potrebbe causare la mancata riuscita dellistruzione perché Col1
nella tabella di origine non è accessibile.
E < clause_search_condition >
Specifica qualsiasi condizione di ricerca valida. Per ulteriori informazioni, consulta Condizione di ricerca (Transact-SQL).
< table_hint_limited >
Specifica uno o più suggerimenti di tabella da applicare alla tabella di destinazione per ciascuno di questi e inserire, aggiornare o eliminare le azioni eseguite dallistruzione MERGE. La parola chiave WITH e le parentesi sono obbligatorie.
NOLOCK e READUNCOMMITTED non sono consentiti. Per ulteriori informazioni sui suggerimenti di tabella, vedere Suggerimenti di tabella (Transact-SQL).
La specifica dellhint TABLOCK su una tabella che è la destinazione di unistruzione INSERT ha lo stesso effetto della specifica dellhint TABLOCKX. Viene applicato un blocco esclusivo sulla tabella. Quando FORCESEEK è specificato, si applica a listanza implicita della tabella di destinazione unita alla tabella di origine.
Attenzione
La specifica di READPAST con WHEN NOT MATCHED THEN INSERT può comportare operazioni INSERT che violano i vincoli UNIQUE.
INDEX (index_val)
Specifica il nome o lID di uno o più indici sulla tabella di destinazione per eseguire un join implicito con la tabella di origine. Per ulteriori informazioni, consulta Suggerimenti per la tabella (Transact -SQL).
< output_clause >
Restituisce una riga per ogni riga in target_table che “s aggiornato, inserito o eliminato, senza un ordine particolare. $ action può essere specificata nella clausola output. $ action è una colonna di tipo nvarchar (10) che restituisce uno dei tre valori per ogni riga: “INSERT”, “UPDATE” o “DELETE”, a seconda dellazione eseguita su quella riga. Per ulteriori informazioni sugli argomenti e sul comportamento di questa clausola, vedere clausola OUTPUT (Transact-SQL).
< merge_matched >
Specifica lazione di aggiornamento o eliminazione applicata a tutte le righe di target_table che non corrispondono alle righe restituite da < table_source > ON < merge_search_condition > e che soddisfano qualsiasi condizione di ricerca aggiuntiva.
UPDATE SET < set_clause >
Specifica lelenco di nomi di colonne o variabili da aggiornare nella tabella di destinazione e i valori con cui aggiornarli.
Per ulteriori informazioni sugli argomenti di questa clausola, vedere UPDATE (Transact-SQL). Limpostazione di una variabile sullo stesso valore di una colonna non è supportata.
DELETE
Specifica che le righe corrispondenti alle righe in target_table vengono eliminate.
< merge_not_matched >
Specifica i valori da inserire nella tabella di destinazione.
(column_list)
Un elenco di uno o più colonne della tabella di destinazione in cui inserire i dati. Le colonne devono essere specificate come un nome in una singola parte altrimenti listruzione MERGE fallirà. column_list deve essere racchiuso tra parentesi e delimitato da virgole.
VALUES ( value_list)
Un elenco separato da virgole di costanti, variabili o espressioni che restituiscono valori da inserire nella tabella di destinazione. Le espressioni non possono contenere unistruzione EXECUTE.
VALORI PREDEFINITI
Forza la riga inserita per contenere i valori predefiniti definiti per ciascuna colonna.
Per ulteriori informazioni su questa clausola, vedere INSERT (Transact-SQL).
< search_condition >
Speci fies le condizioni di ricerca per specificare < merge_search_condition > o < clausola_search_condition >. Per ulteriori informazioni sugli argomenti di questa clausola, vedere Condizione di ricerca (Transact-SQL).
< pattern di ricerca grafico >
Specifica il modello di corrispondenza del grafico. Per ulteriori informazioni sugli argomenti di questa clausola, vedere MATCH (Transact-SQL)
Osservazioni
Nota
In Azure Synapse Analytics, MERGE Il comando (anteprima) presenta le seguenti differenze rispetto al server SQL e al database SQL di Azure.
- Un aggiornamento MERGE viene implementato come coppia di eliminazione e inserimento. Il conteggio delle righe interessate per un aggiornamento MERGE include le righe eliminate e inserite.
- Durante lanteprima, le tabelle con colonne Identity non sono supportate dal comando Synapse SQL MERGE.
- Il supporto per tabelle con diversi tipi di distribuzione sono descritte in questa tabella:
MERGE CLAUSE in Azure Synapse Analytics Tabella di distribuzione TARGE supportata Tabella di distribuzione SOURCE supportata Commenta WHEN MATCHED Tutti i tipi di distribuzione Tutti i tipi di distribuzione NON CORRISPONDENTI PER TARGET HASH Tutti i tipi di distribuzione Usa UPDATE / DELETE FROM … JOIN per sincronizzare due tabelle. NON CORRISPONDENTE PER SORGENTE Tutti i tipi di distribuzione Tutti i tipi di distribuzione
È necessario specificare almeno una delle tre clausole MATCHED, ma possono essere specificate in qualsiasi ordine. Una variabile non può essere aggiornata più di una volta nella stessa clausola MATCHED.
Qualsiasi azione di inserimento, aggiornamento o eliminazione specificata nella tabella di destinazione dallistruzione MERGE è limitata da qualsiasi vincolo definito su di essa, inclusi eventuali vincoli di integrità referenziale a cascata. Se IGNORE_DUP_KEY è ON per qualsiasi indice univoco sulla tabella di destinazione, MERGE ignora questa impostazione.
Listruzione MERGE richiede un punto e virgola (;) come terminatore dellistruzione. Lerrore 10713 viene generato quando unistruzione MERGE viene eseguita senza il terminatore.
Quando viene utilizzato dopo MERGE, @@ ROWCOUNT (Transact-SQL) restituisce il numero totale di righe inserite, aggiornate ed eliminate al client.
MERGE è una parola chiave completamente riservata quando il livello di compatibilità del database è impostato su 100 o superiore. Listruzione MERGE è disponibile con livelli di compatibilità del database sia 90 che 100; tuttavia, la parola chiave non è completamente riservata quando il livello di compatibilità del database è impostato su 90.
Non utilizzare listruzione MERGE quando si utilizza la replica con aggiornamento in coda. Il MERGE e il trigger di aggiornamento in coda non sono compatibili. Sostituisci listruzione MERGE con unistruzione di inserimento o aggiornamento.
Implementazione del trigger
Per ogni azione di inserimento, aggiornamento o eliminazione specificata in listruzione MERGE, SQL Server attiva tutti i trigger AFTER corrispondenti definiti nella tabella di destinazione, ma non garantisce su quale azione attivare i trigger per primi o ultimi. I trigger definiti per la stessa azione rispettano lordine specificato. Per ulteriori informazioni sullimpostazione dellordine di attivazione del trigger, vedere Specify First and Last Triggers.
Se la tabella di destinazione ha un trigger INSTEAD OF abilitato definito su di essa per unazione di inserimento, aggiornamento o eliminazione eseguita da unistruzione MERGE , deve avere un trigger INSTEAD OF abilitato per tutte le azioni specificate nellistruzione MERGE.
Se qualsiasi trigger INSTEAD OF UPDATE o INSTEAD OF DELETE è definito su target_table, le operazioni di aggiornamento o eliminazione non sono “t Al contrario, i trigger vengono attivati e le tabelle inserite ed eliminate vengono popolate di conseguenza.
Se qualsiasi trigger INSTEAD OF INSERT è definito su target_table, loperazione di inserimento non viene eseguita. Invece, la tabella viene popolata di conseguenza.
Autorizzazioni
Richiede lautorizzazione SELECT sulla tabella di origine e le autorizzazioni INSERT, UPDATE o DELETE sulla tabella di destinazione. Per ulteriori informazioni, vedere la sezione Autorizzazioni negli articoli SELECT, INSERT, UPDATE e DELETE.
Ottimizzazione delle prestazioni dellistruzione MERGE
Utilizzando listruzione MERGE, è possibile sostituire il singolo DML dichiarazioni con una sola dichiarazione. Ciò può migliorare le prestazioni delle query perché le operazioni vengono eseguite allinterno di una singola istruzione, riducendo al minimo il numero di volte in cui vengono elaborati i dati nelle tabelle di origine e di destinazione. Tuttavia, i miglioramenti delle prestazioni dipendono dalla presenza di indici, join e altre considerazioni corretti in atto.
Best practice per gli indici
Per migliorare le prestazioni dellistruzione MERGE, consigliamo le seguenti linee guida sugli indici :
- Crea un indice sulle colonne di join nella tabella di origine che sia univoco e coprente.
- Crea un indice cluster univoco sulle colonne di join nella tabella di destinazione.
Questi indici assicurano che le chiavi di join siano univoche e che i dati nelle tabelle siano ordinati. Le prestazioni delle query sono migliorate perché Query Optimizer non ha bisogno di eseguire unelaborazione di convalida aggiuntiva per individuare e aggiornare le righe duplicate e non sono necessarie ulteriori operazioni di ordinamento.
JOIN Best practice
Per migliorare il prestazioni dellistruzione MERGE e assicurati di ottenere risultati corretti, consigliamo le seguenti linee guida per il join:
- Specifica solo le condizioni di ricerca in ON < merge_search_condition > clausola che determina i criteri per la corrispondenza dei dati nelle tabelle di origine e di destinazione. Ovvero, specifica solo le colonne della tabella di destinazione che vengono confrontate con le colonne corrispondenti della tabella di origine.
- Non includere confronti con altri valori come una costante.
Per filtrare le righe dalle tabelle di origine o di destinazione, utilizzare uno dei seguenti metodi.
- Specificare la condizione di ricerca per il filtro di riga nella clausola WHEN appropriata. Ad esempio, WHEN NOT MATCHED AND S.EmployeeName LIKE “S%” THEN INSERT ….
- Definisci una vista sullorigine o sulla destinazione che restituisca le righe filtrate e faccia riferimento alla vista come origine o destinazione tavolo. Se la vista è definita nella tabella di destinazione, qualsiasi azione contro di essa deve soddisfare le condizioni per laggiornamento delle viste. Per ulteriori informazioni sullaggiornamento dei dati utilizzando una vista, consulta Modifica dei dati tramite una vista.
- Utilizza la clausola
WITH <common table expression>
per filtrare le righe dalle tabelle di origine o di destinazione . Questo metodo è simile alla specifica di criteri di ricerca aggiuntivi nella clausola ON e potrebbe produrre risultati errati. Si consiglia di evitare di utilizzare questo metodo o di testarlo accuratamente prima di implementarlo.
Loperazione di join nellistruzione MERGE è ottimizzata allo stesso modo di un join in unistruzione SELECT. Vale a dire, quando i processi di SQL Server si uniscono, Query Optimizer sceglie il metodo più efficiente (tra diverse possibilità) di elaborazione del join. Quando lorigine e la destinazione hanno dimensioni simili e le linee guida sullindice descritte in precedenza vengono applicate alle tabelle di origine e di destinazione, un operatore di unione di unione è il piano di query più efficiente. Questo perché entrambe le tabelle vengono scansionate una volta e non è necessario ordinare i dati. Quando la sorgente è più piccola della tabella di destinazione, è preferibile un operatore di cicli nidificati.
Puoi forzare luso di un join specifico specificando la clausola OPTION (<query_hint>)
in listruzione MERGE. Si consiglia di non utilizzare lhash join come suggerimento per la query per le istruzioni MERGE perché questo tipo di join non utilizza gli indici.
Best practice per la parametrizzazione
Se SELECT, INSERT, UPDATE o listruzione DELETE viene eseguita senza parametri, Query Optimizer di SQL Server può scegliere di parametrizzare internamente listruzione. Ciò significa che tutti i valori letterali contenuti nella query vengono sostituiti con parametri. Ad esempio, listruzione INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), può essere implementata internamente come INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Questo processo, chiamato parametrizzazione semplice, aumenta la capacità del motore relazionale di abbinare nuove istruzioni SQL con piani di esecuzione già compilati in precedenza. Le prestazioni delle query possono essere migliorate perché la frequenza delle compilazioni e ricompilazioni delle query è ridotta. Query Optimizer non applica il semplice processo di parametrizzazione alle istruzioni MERGE. Pertanto, le istruzioni MERGE che contengono valori letterali potrebbero non funzionare come le singole istruzioni INSERT, UPDATE o DELETE perché viene compilato un nuovo piano ogni volta che viene eseguita listruzione MERGE.
Per migliorare le prestazioni delle query, si consiglia di le seguenti linee guida per la parametrizzazione:
- Parametrizza tutti i valori letterali nella clausola
ON <merge_search_condition>
e nellaWHEN
clausole dellistruzione MERGE. Ad esempio, è possibile incorporare listruzione MERGE in una stored procedure sostituendo i valori letterali con parametri di input appropriati. - Se non è possibile parametrizzare listruzione, creare una guida di piano di tipo
TEMPLATE
e specifica ilPARAMETERIZATION FORCED
suggerimento per la query nella guida di piano. - Se le istruzioni MERGE vengono eseguite frequentemente sul database, valuta la possibilità di impostare lopzione PARAMETERIZATION sul database su FORZATO. Prestare attenzione quando si imposta questa opzione. Lopzione
PARAMETERIZATION
è unimpostazione a livello di database e influisce sul modo in cui vengono elaborate tutte le query sul database.
Clausola TOP Best practice
Nellistruzione MERGE, la clausola TOP specifica il numero o la percentuale di righe interessate dopo che la tabella di origine e la tabella di destinazione sono state unite e dopo che le righe che non si qualificano per unazione di inserimento, aggiornamento o eliminazione sono state rimosse . La clausola TOP riduce ulteriormente il numero di righe unite al valore specificato e le azioni di inserimento, aggiornamento o eliminazione vengono applicate alle righe unite rimanenti in modo non ordinato. Ovvero, non esiste un ordine in cui le righe vengono distribuite tra le azioni definite nelle clausole WHEN. Ad esempio, specificare TOP (10) influisce su 10 righe; di queste righe, 7 possono essere aggiornate e 3 inserite, oppure 1 può essere cancellata, 5 aggiornate e 4 inserite e così via.
È comune utilizzare la clausola TOP per eseguire il linguaggio di manipolazione dei dati (DML ) operazioni su una tabella di grandi dimensioni in batch. Quando si utilizza la clausola TOP nellistruzione MERGE per questo scopo, è importante comprendere le seguenti implicazioni.
-
Le prestazioni di I / O potrebbero essere influenzate.
Listruzione MERGE esegue una scansione completa della tabella delle tabelle di origine e di destinazione. La divisione delloperazione in batch riduce il numero di operazioni di scrittura eseguite per batch; tuttavia, ogni batch eseguirà una scansione completa della tabella delle tabelle di origine e di destinazione. Lattività di lettura risultante può influire sulle prestazioni della query.
-
Possono verificarsi risultati errati.
È importante assicurarsi che tutti i batch successivi abbiano come destinazione nuove righe oppure possono verificarsi comportamenti indesiderati come linserimento errato di righe duplicate nella tabella di destinazione. Ciò può accadere quando la tabella di origine include una riga che non era in un batch di destinazione ma era nella tabella di destinazione complessiva.
-
Per garantire risultati corretti:
- Utilizza la clausola ON per determinare quali righe di origine influiscono sulle righe di destinazione esistenti e quali sono realmente nuove.
- Utilizza una condizione aggiuntiva nella clausola WHEN MATCHED per determinare se la riga di destinazione è già stata aggiornata da un lotto precedente.
Poiché la clausola TOP viene applicata solo dopo lapplicazione di queste clausole, ogni esecuzione inserisce una riga effettivamente non corrispondente o aggiorna una riga esistente.
Best practice per il caricamento di massa
Listruzione MERGE può essere utilizzata per caricare in modo efficiente i dati da un file di dati di origine in una tabella di destinazione specificando la clausola OPENROWSET(BULK…)
come fonte della tabella. In questo modo, lintero file viene elaborato in un unico batch.
Per migliorare le prestazioni del processo di unione in blocco, consigliamo le seguenti linee guida:
-
Crea un indice cluster sulle colonne di join nella tabella di destinazione.
-
Utilizza i suggerimenti ORDER e UNIQUE nella clausola
OPENROWSET(BULK…)
per specificare come viene ordinato il file di dati di origine.Per impostazione predefinita, loperazione di massa presuppone che il file di dati non sia ordinato. Pertanto, è importante che i dati di origine siano ordinati in base allindice cluster nella tabella di destinazione e che lhint ORDER venga utilizzato per indicare lordine in modo che Query Optimizer possa generare un piano di query più efficiente. I suggerimenti vengono convalidati in fase di esecuzione; se il flusso di dati non è conforme ai suggerimenti specificati, viene generato un errore.
Queste linee guida assicurano che le chiavi di join siano univoche e lordinamento dei dati nel il file di origine corrisponde alla tabella di destinazione. Le prestazioni delle query sono migliorate perché non sono necessarie operazioni di ordinamento aggiuntive e non sono necessarie copie di dati non necessarie.
Misurazione e diagnosi delle prestazioni di MERGE
Le seguenti funzionalità sono disponibili per assistere lutente nella misurazione e nella diagnosi le prestazioni delle istruzioni MERGE.
- Utilizza il contatore stmt merge nella vista a gestione dinamica sys.dm_exec_query_optimizer_info per restituire il numero di ottimizzazioni delle query per le istruzioni MERGE.
- Utilizza lattributo merge_action_type nella vista a gestione dinamica sys.dm_exec_plan_attributes per restituire il tipo di piano di esecuzione del trigger utilizzato come risultato di unistruzione MERGE.
- Utilizzare SQL Trace per raccogliere i dati di risoluzione dei problemi per listruzione MERGE allo stesso modo lo faresti per altre istruzioni DML (Data Manipulation Language). Per ulteriori informazioni, vedere Traccia SQL.
Esempi
A. Utilizzo di MERGE per eseguire operazioni INSERT e UPDATE su una tabella in una singola istruzione
Uno scenario comune è laggiornamento di una o più colonne in una tabella se esiste una riga corrispondente. Oppure, inserendo i dati come una nuova riga se non esiste una riga corrispondente. Di solito si esegue uno degli scenari passando i parametri a una procedura memorizzata che contiene le istruzioni UPDATE e INSERT appropriate. Con listruzione MERGE, è possibile eseguire entrambe le attività in una singola istruzione. Lesempio seguente mostra una stored procedure nel database AdventureWorks2012 che contiene sia unistruzione INSERT che unistruzione UPDATE. La procedura viene quindi modificata per eseguire le operazioni equivalenti utilizzando una singola istruzione MERGE.
B . Utilizzo di MERGE per eseguire operazioni UPDATE e DELETE su una tabella in una singola istruzione
Lesempio seguente utilizza MERGE per aggiornare la tabella ProductInventory
nel database di esempio AdventureWorks2012, ogni giorno, in base agli ordini elaborati nella tabella SalesOrderDetail
. La colonna Quantity
della ProductInventory
viene aggiornata sottraendo il numero di ordini effettuati ogni giorno per ciascun prodotto in SalesOrderDetail
tabella. Se il numero di ordini per un prodotto riduce il livello di inventario di un prodotto a 0 o meno, la riga per quel prodotto viene eliminata dalla tabella ProductInventory
.
C. Utilizzo di MERGE per eseguire operazioni UPDATE e INSERT su una tabella di destinazione utilizzando una tabella di origine derivata
Lesempio seguente utilizza MERGE per modificare la tabella SalesReason
nel database AdventureWorks2012 aggiornando o inserendo righe. Quando il valore di NewName
nella tabella di origine corrisponde a un valore nella colonna Name
della tabella di destinazione, (SalesReason
), la colonna ReasonType
viene aggiornata nella tabella di destinazione. Quando il valore di NewName
non corrisponde, la riga di origine viene inserita nella tabella di destinazione. La tabella di origine è una tabella derivata che utilizza il costruttore di valori di tabella Transact-SQL per specificare più righe per la tabella di origine. Per ulteriori informazioni sullutilizzo del costruttore di valori di tabella in una tabella derivata, vedere Costruttore di valori di tabella (Transact-SQL). Lesempio mostra anche come archiviare i risultati della clausola OUTPUT in una variabile di tabella. Inoltre, quindi riassumi i risultati dellistruzione MERGE eseguendo una semplice operazione di selezione che restituisce il conteggio delle righe inserite e aggiornate.
D.Inserimento dei risultati dellistruzione MERGE in unaltra tabella
Lesempio seguente acquisisce i dati restituiti dalla clausola OUTPUT di unistruzione MERGE e inserisce tali dati in unaltra tabella. Listruzione MERGE aggiorna la colonna Quantity
della tabella ProductInventory
nel database AdventureWorks2012, in base agli ordini elaborati nel SalesOrderDetail
tabella. Lesempio acquisisce le righe aggiornate e le inserisce in unaltra tabella utilizzata per tenere traccia delle modifiche allo spazio pubblicitario.
E. Utilizzo di MERGE per eseguire INSERT o UPDATE il una tabella edge di destinazione in un database a grafici
In questo esempio, crei tabelle dei nodi Person
e City
e un edge table livesIn
. Utilizza listruzione MERGE sul bordo livesIn
e inserisci una nuova riga se il bordo non esiste già tra un Person
e City
. Se il bordo esiste già, aggiorna lattributo StreetAddress sul bordo livesIn
.