- 20/08/2019
- 25 minutes de lecture
-
- X
- c
- j
- r
- a
-
+18
Sapplique à: SQL Server (toutes les versions prises en charge) Azure SQL Database Azure Synapse Analytics
Exécute des opérations dinsertion, de mise à jour ou de suppression sur une table cible depuis les résultats dune jointure avec une table source. Par exemple, synchronisez deux tables en insérant, en mettant à jour ou en supprimant des lignes dans une table en fonction des différences trouvées dans lautre table.
Remarque
MERGE est actuellement en préversion pour Azure Synapse Analytics.
Conseil sur les performances: le comportement conditionnel décrit pour linstruction MERGE fonctionne mieux lorsque les deux tables ont un mélange complexe de caractéristiques de correspondance. Par exemple, insérer une ligne si elle nexiste pas ou mettre à jour une ligne si elle correspond. Lorsque vous mettez simplement à jour une table en fonction des lignes dune autre table, améliorez les performances et lévolutivité avec les instructions INSERT, UPDATE et DELETE de base. Pour exemple:
Conventions de syntaxe Transact-SQL
Syntaxe
Remarque
Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 et versions antérieures, consultez la documentation des versions précédentes.
Arguments
WITH < common_table_expression >
Spécifie le jeu de résultats ou la vue nommé temporaire, également appelé expression de table commune, qui « est défini dans le cadre de linstruction MERGE. Lensemble de résultats dérive dune requête simple et est référencé par linstruction MERGE. Pour plus dinformations, consultez WITH common_table_expression (Transact-SQL).
TOP (expression)
Spécifie le nombre ou le pourcentage de lignes affectées. expression peut être un nombre ou un pourcentage des lignes. Les lignes référencées dans lexpression TOP ne sont organisées dans aucun ordre. Pour plus dinformations, consultez TOP (Transact-SQL).
La clause TOP sapplique après la jointure de la table source entière et de la table cible entière et des lignes jointes qui ne sont pas éligibles pour une insertion, une mise à jour ou supprimer sont supprimées. La clause TOP réduit encore le nombre de lignes jointes à la valeur spécifiée. Les actions dinsertion, de mise à jour ou de suppression sappliquent aux lignes jointes restantes de manière non ordonnée. Autrement dit, il ny a pas dordre dans lequel les les lignes sont réparties entre les actions définies dans les clauses WHEN. Par exemple, la spécification de TOP (10) affecte 10 lignes. Parmi ces lignes, 7 peuvent être mises à jour et 3 insérées, ou 1 peut être supprimée, 5 mises à jour et 4 insérées, et ainsi de suite.
Parce que linstruction MERGE effectue une analyse complète de la table de la source et tables cibles, les performances dE / S sont parfois affectées lors de lutilisation de la clause TOP pour modifier une grande table en créant plusieurs lots. Dans ce scénario, il est important de sassurer que tous les lots successifs ciblent de nouvelles lignes.
nom_base_de_données
Le nom de la base de données dans laquelle se trouve table_cible.
nom_schéma
Le nom du schéma auquel appartient target_table.
target_table
La table ou la vue par rapport à laquelle les lignes de données de < table_source > sont mis en correspondance en fonction de < clause_search_condition >. target_table est la cible de toute opération dinsertion, de mise à jour ou de suppression spécifiée par les clauses WHEN de linstruction MERGE.
Si target_table est une vue, toute action contre celle-ci doit satisfaire aux conditions de mise à jour des vues. Pour plus dinformations, voir Modifier les données via une vue.
target_table ne peut pas être une table distante. target_table ne peut avoir aucune règle définie dessus.
table_alias
Un nom alternatif pour référencer une table pour la target_table.
UTILISATION de < table_source >
Spécifie la source de données qui « correspond aux lignes de données de target_table en fonction de la < condition de merge_search >. Le résultat de cette correspondance dicte les actions à entreprendre par les clauses WHEN de linstruction MERGE. < table_source > peut être une table distante ou une table dérivée qui accède aux tables distantes.
< table_source > peut être une table dérivée qui utilise le constructeur de valeurs de table Transact-SQL pour construire une table en spécifiant plusieurs lignes.
table_alias
Un autre nom pour référencer une table pour la table_source.
Pour plus dinformations sur la syntaxe et les arguments de cette clause, consultez FROM (Transact-SQL).
ON < merge_search_condition >
Spécifie les conditions dans lesquelles < table_source > se joint à target_table pour déterminer où ils correspondent.
Attention
Il est important de spécifier uniquement les colonnes de la table cible à utiliser à des fins de correspondance. Autrement dit, spécifiez les colonnes de la table cible qui sont comparées à la colonne correspondante de la table source. Nessayez pas daméliorer les performances des requêtes en filtrant les lignes de la table cible dans la clause ON; par exemple, comme la spécification de AND NOT target_table.column_x = value
. Cela risquerait de renvoyer des résultats inattendus et incorrects.
WHEN MATCHED THEN < merge_matched >
Spécifie que toutes les lignes de * target_table, qui correspondent aux lignes renvoyées par < table_source > ON < merge_search_condition >, et satisfont à toute condition de recherche supplémentaire, sont mis à jour ou supprimés conformément à < merge_matched .
Linstruction MERGE peut avoir, au plus, deux clauses WHEN MATCHED. Si deux clauses sont spécifiées, la première clause doit être accompagnée dune clause AND < search_condition >. Pour une ligne donnée, la deuxième clause WHEN MATCHED nest appliquée que si la première nest pas « t. Sil y a deux clauses WHEN MATCHED, il faut spécifier une action UPDATE et une autre doit spécifier une action DELETE. Lorsque UPDATE est spécifié dans < merge_matched > clause, et plusieurs lignes de < table_source > correspond à une ligne de target_table basée sur < merge_search_condition >, SQL Server renvoie une erreur. Linstruction MERGE peut » t mettre à jour la même ligne plus dune fois, ou mettre à jour et supprimer la même ligne.
QUAND PAS DE MATCH ALORS < merge_not_matched >
Spécifie quune ligne est insérée dans target_table pour chaque ligne renvoyée par < table_source > ON < merge_search_condition > qui ne correspond pas à une ligne de targ et_table, mais satisfait une condition de recherche supplémentaire, si elle est présente. Les valeurs à insérer sont spécifiées par la clause < merge_not_matched >. Linstruction MERGE ne peut avoir quune seule clause WHEN NOT MATCHED.
WHEN NOT MATCHED BY SOURCE THEN < merge_matched >
Spécifie que toutes les lignes de * target_table, qui ne correspondent pas aux lignes renvoyées par < table_source > ON < merge_search_condition >, et qui satisfont à toute condition de recherche supplémentaire, sont mis à jour ou supprimés conformément à < merge_matched Clause >.
Linstruction MERGE peut avoir au plus deux clauses WHEN NOT MATCHED BY SOURCE. Si deux clauses sont spécifiées, la première clause doit être accompagnée de une clause AND < clause_search_condition >. Pour toute ligne donnée, la deuxième clause WHEN NOT MATCHED BY SOURCE nest appliquée que si la première nest » t. Sil existe deux clauses WHEN NOT MATCHED BY SOURCE, il faut alors spécifier une action UPDATE et une action DELETE. Seules les colonnes de la table cible peuvent être référencées dans < clause_search_condition >.
Lorsquaucune ligne nest renvoyée par < table_source >, les colonnes de la table source ne sont « pas accessibles. Si laction de mise à jour ou de suppression spécifiée dans merge_matched > fait référence aux colonnes de la table source, lerreur 207 (nom de colonne non valide) est renvoyée. Par exemple, la clause WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
peut entraîner léchec de linstruction car Col1
dans la table source est inaccessible.
AND < clause_search_condition >
Spécifie toute condition de recherche valide. Pour plus dinformations, voir Condition de recherche (Transact-SQL).
< table_hint_limited >
Spécifie une ou plusieurs indications de table à appliquer sur la table cible pour chacun des e insérer, mettre à jour ou supprimer des actions effectuées par linstruction MERGE. Le mot clé WITH et les parenthèses sont obligatoires.
NOLOCK et READUNCOMMITTED ne sont pas autorisés. Pour plus dinformations sur les indicateurs de table, consultez Indicateurs de table (Transact-SQL).
La spécification de lindicateur TABLOCK sur une table qui est la cible dune instruction INSERT a le même effet que la spécification de lindication TABLOCKX. Un verrou exclusif est pris sur la table. Lorsque FORCESEEK est spécifié, il sapplique à linstance implicite de la table cible jointe à la table source.
Attention
Spécifier READPAST avec WHEN NOT MATCHED THEN INSERT peut entraîner des opérations INSERT qui violent les contraintes UNIQUE.
INDEX (index_val)
Spécifie le nom ou lID dun ou de plusieurs index sur la table cible pour effectuer une jointure implicite avec la table source. Pour plus dinformations, consultez Conseils de table (Transact -SQL).
< output_clause >
Renvoie une ligne pour chaque ligne de target_table qui « s mis à jour, inséré ou supprimé, sans ordre particulier. $ action peut être spécifié dans la clause de sortie. $ action est une colonne de type nvarchar (10) qui renvoie lune des trois valeurs pour chaque ligne: « INSERT », « UPDATE » ou « DELETE », selon laction effectuée sur cette ligne. Pour plus dinformations sur les arguments et le comportement de cette clause, consultez Clause OUTPUT (Transact-SQL).
< merge_matched >
Spécifie laction de mise à jour ou de suppression qui « est appliquée à toutes les lignes de target_table qui ne correspondent pas aux lignes renvoyées par < table_source > ON < merge_search_condition >, et qui satisfont à toute condition de recherche supplémentaire.
UPDATE SET < set_clause >
Spécifie la liste des noms de colonnes ou de variables à mettre à jour dans la table cible et les valeurs avec lesquelles les mettre à jour.
Pour plus dinformations sur les arguments de cette clause, consultez UPDATE (Transact-SQL). La définition dune variable sur la même valeur quune colonne nest pas prise en charge.
DELETE
Spécifie que les lignes correspondant aux lignes de target_table sont supprimées.
< merge_not_matched >
Spécifie les valeurs à insérer dans la table cible.
(column_list)
Une liste dune ou plus de colonnes de la table cible dans lesquelles insérer des données. Les colonnes doivent être spécifiées sous la forme dun nom en une seule partie, sinon linstruction MERGE échouera. column_list doit être entre parenthèses et délimité par des virgules.
VALUES ( values_list)
Une liste séparée par des virgules de constantes, de variables ou dexpressions qui renvoient des valeurs à insérer dans la table cible. Les expressions ne peuvent « pas contenir dinstruction EXECUTE.
VALEURS PAR DÉFAUT
Force le ligne insérée pour contenir les valeurs par défaut définies pour chaque colonne.
Pour plus dinformations sur cette clause, voir INSERT (Transact-SQL).
< condition_recherche >
Speci remplit les conditions de recherche pour spécifier < merge_search_condition > ou < clause_search_condition >. Pour plus dinformations sur les arguments de cette clause, consultez Condition de recherche (Transact-SQL).
< modèle de recherche de graphique >
Spécifie le modèle de correspondance du graphique. Pour plus dinformations sur les arguments de cette clause, consultez MATCH (Transact-SQL)
Remarques
Remarque
Dans Azure Synapse Analytics, le MERGE La commande (aperçu) présente les différences suivantes par rapport au serveur SQL et à la base de données Azure SQL.
- Une mise à jour MERGE est implémentée en tant que paire de suppression et dinsertion. Le nombre de lignes affectées pour une mise à jour MERGE inclut les lignes supprimées et insérées.
- Pendant laperçu, les tables avec une colonne didentité ne sont pas prises en charge par la commande Synapse SQL MERGE.
- La prise en charge de les tables avec différents types de distribution sont décrites dans ce tableau:
CLAUSE MERGE dans Azure Synapse Analytics Table de distribution TARGE prise en charge Table de distribution SOURCE prise en charge Commentaire WHEN MATCHED Tous les types de distribution Tous les types de distribution NON CORRESPONDANT À LA CIBLE HASH Tous les types de distribution Utilisez UPDATE / DELETE FROM… JOIN pour synchroniser deux tables. PAS DE CORRESPONDANCE PAR SOURCE Tous les types de distribution Tous les types de distribution
Au moins une des trois clauses MATCHED doit être spécifiée, mais elles peuvent être spécifiées dans nimporte quel ordre. Une variable ne peut pas être mise à jour plus dune fois dans la même clause MATCHED.
Toute action dinsertion, de mise à jour ou de suppression spécifiée sur la table cible par linstruction MERGE est limitée par toutes les contraintes qui y sont définies, y compris les contraintes dintégrité référentielle en cascade. Si IGNORE_DUP_KEY est activé pour des index uniques sur la table cible, MERGE ignore ce paramètre.
Linstruction MERGE nécessite un point-virgule (;) comme terminateur dinstruction. Lerreur 10713 est déclenchée lorsquune instruction MERGE est exécutée sans le terminateur.
Lorsquelle est utilisée après MERGE, @@ ROWCOUNT (Transact-SQL) renvoie le nombre total de lignes insérées, mises à jour et supprimées au client.
MERGE est un mot-clé entièrement réservé lorsque le niveau de compatibilité de la base de données est défini sur 100 ou plus. Linstruction MERGE est disponible sous les niveaux de compatibilité de base de données 90 et 100; cependant, le mot-clé nest pas entièrement réservé lorsque le niveau de compatibilité de la base de données est défini sur 90.
Nutilisez pas linstruction MERGE lorsque vous utilisez la réplication de mise à jour en file dattente. Le déclencheur de mise à jour MERGE et en file dattente ne sont pas compatibles. Remplacez linstruction MERGE par une instruction dinsertion ou de mise à jour.
Implémentation du déclencheur
Pour chaque action dinsertion, de mise à jour ou de suppression spécifiée dans linstruction MERGE, SQL Server déclenche tous les déclencheurs AFTER correspondants définis sur la table cible, mais ne garantit pas sur quelle action déclencher les déclencheurs en premier ou en dernier. Les déclencheurs définis pour la même action respectent lordre que vous spécifiez. Pour plus dinformations sur la définition de lordre de déclenchement des déclencheurs, voir Spécifier le premier et le dernier déclencheurs.
Si la table cible a un déclencheur INSTEAD OF activé défini dessus pour une action dinsertion, de mise à jour ou de suppression effectuée par une instruction MERGE , il doit avoir un déclencheur INSTEAD OF activé pour toutes les actions spécifiées dans linstruction MERGE.
Si des déclencheurs INSTEAD OF UPDATE ou INSTEAD OF DELETE sont définis sur target_table, les opérations de mise à jour ou de suppression ne sont pas À la place, les déclencheurs se déclenchent et les tables insérées et supprimées sont alors remplies en conséquence.
Si des déclencheurs INSTEAD OF INSERT sont définis sur target_table, lopération dinsertion nest pas effectuée. À la place, la table se remplit en conséquence.
Autorisations
Requiert lautorisation SELECT sur la table source et les autorisations INSERT, UPDATE ou DELETE sur la table cible. Pour plus dinformations, consultez la section Autorisations dans les articles SELECT, INSERT, UPDATE et DELETE.
Optimisation des performances de linstruction MERGE
En utilisant linstruction MERGE, vous pouvez remplacer le DML individuel déclarations avec une seule déclaration. Cela peut améliorer les performances des requêtes, car les opérations sont effectuées dans une seule instruction, ce qui minimise le nombre de fois que les données des tables source et cible sont traitées. Cependant, les gains de performances dépendent de la mise en place dindex, de jointures et dautres considérations corrects.
Bonnes pratiques relatives aux index
Pour améliorer les performances de linstruction MERGE, nous vous recommandons les consignes dindexation suivantes :
- Créez un index sur les colonnes de jointure de la table source qui est unique et couvrant.
- Créez un index clusterisé unique sur les colonnes de jointure de la table cible.
Ces index garantissent que les clés de jointure sont uniques et que les données des tables sont triées. Les performances des requêtes sont améliorées car loptimiseur de requêtes na pas besoin deffectuer un traitement de validation supplémentaire pour localiser et mettre à jour les lignes en double et des opérations de tri supplémentaires ne sont pas nécessaires.
JOIN Best Practices
Pour améliorer la performance de linstruction MERGE et assurez-vous que des résultats corrects sont obtenus, nous recommandons les instructions de jointure suivantes:
- Spécifiez uniquement les conditions de recherche dans ON < merge_search_condition > qui détermine les critères de correspondance des données dans les tables source et cible. Autrement dit, ne spécifiez que les colonnes de la table cible qui sont comparées aux colonnes correspondantes de la table source.
- Nincluez pas de comparaisons avec dautres valeurs telles quune constante.
Pour filtrer les lignes des tables source ou cible, utilisez lune des méthodes suivantes.
- Spécifiez la condition de recherche pour le filtrage des lignes dans la clause WHEN appropriée. Par exemple, WHEN NOT MATCHED AND S.EmployeeName LIKE « S% » THEN INSERT ….
- Définit une vue sur la source ou la cible qui renvoie les lignes filtrées et référence la vue comme source ou cible table. Si la vue est définie sur la table cible, toute action à son encontre doit remplir les conditions de mise à jour des vues. Pour plus dinformations sur la mise à jour des données à laide dune vue, consultez la rubrique Modification des données via une vue.
- Utilisez la clause
WITH <common table expression>
pour filtrer les lignes des tables source ou cible . Cette méthode est similaire à la spécification de critères de recherche supplémentaires dans la clause ON et peut produire des résultats incorrects. Nous vous recommandons déviter dutiliser cette méthode ou deffectuer des tests approfondis avant de limplémenter.
Lopération de jointure dans linstruction MERGE est optimisée de la même manière quune jointure dans une instruction SELECT. Autrement dit, lorsque SQL Server traite des jointures, loptimiseur de requêtes choisit la méthode la plus efficace (parmi plusieurs possibilités) de traitement de la jointure. Lorsque la source et la cible sont de taille similaire et que les instructions dindex décrites précédemment sont appliquées aux tables source et cible, un opérateur de jointure par fusion est le plan de requête le plus efficace. En effet, les deux tables sont analysées une fois et il nest pas nécessaire de trier les données. Lorsque la source est plus petite que la table cible, un opérateur de boucles imbriquées est préférable.
Vous pouvez forcer lutilisation dune jointure spécifique en spécifiant la clause OPTION (<query_hint>)
dans linstruction MERGE. Nous vous recommandons de ne pas utiliser la jointure par hachage comme indicateur de requête pour les instructions MERGE car ce type de jointure nutilise pas dindex.
Bonnes pratiques de paramétrage
Si un SELECT, INSERT, UPDATE ou linstruction DELETE est exécutée sans paramètres, loptimiseur de requêtes SQL Server peut choisir de paramétrer linstruction en interne. Cela signifie que toutes les valeurs littérales contenues dans la requête sont remplacées par des paramètres. Par exemple, linstruction INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) peut être implémentée en interne en tant que INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Ce processus, appelé paramétrage simple, augmente la capacité du moteur relationnel à faire correspondre les nouvelles instructions SQL avec les plans dexécution déjà compilés. Les performances des requêtes peuvent être améliorées car la fréquence des compilations et des recompilations de requêtes est réduite. Loptimiseur de requête napplique pas le processus de paramétrage simple aux instructions MERGE. Par conséquent, les instructions MERGE qui contiennent des valeurs littérales peuvent ne pas fonctionner aussi bien que les instructions INSERT, UPDATE ou DELETE individuelles car un nouveau plan est compilé chaque fois que linstruction MERGE est exécutée.
Pour améliorer les performances des requêtes, nous vous recommandons les instructions de paramétrage suivantes:
- Paramétrer toutes les valeurs littérales dans la clause
ON <merge_search_condition>
et dans laWHEN
clauses de linstruction MERGE. Par exemple, vous pouvez incorporer linstruction MERGE dans une procédure stockée en remplaçant les valeurs littérales par des paramètres dentrée appropriés. - Si vous ne pouvez pas paramétrer linstruction, créez un guide de plan de type
TEMPLATE
et spécifiez lindicateur de requêtePARAMETERIZATION FORCED
dans le guide du plan. - Si les instructions MERGE sont exécutées fréquemment sur la base de données, envisagez de définir loption PARAMETERIZATION sur le base de données à FORCÉ. Soyez prudent lorsque vous définissez cette option. Loption
PARAMETERIZATION
est un paramètre au niveau de la base de données et affecte le traitement de toutes les requêtes sur la base de données.
Meilleures pratiques de la clause TOP
Dans linstruction MERGE, la clause TOP spécifie le nombre ou le pourcentage de lignes affectées après la jointure de la table source et de la table cible, et après la suppression des lignes qui ne remplissent pas les conditions pour une action dinsertion, de mise à jour ou de suppression . La clause TOP réduit davantage le nombre de lignes jointes à la valeur spécifiée et les actions dinsertion, de mise à jour ou de suppression sont appliquées aux lignes jointes restantes de manière non ordonnée. Autrement dit, il ny a pas dordre dans lequel les lignes sont distribuées parmi les actions définies dans les clauses WHEN. Par exemple, la spécification de TOP (10) affecte 10 lignes; de ces lignes, 7 peuvent être mises à jour et 3 insérées, ou 1 peut être supprimée, 5 mises à jour et 4 insérées et ainsi de suite.
Il est courant dutiliser la clause TOP pour exécuter un langage de manipulation de données (DML ) opérations sur une grande table par lots. Lorsque vous utilisez la clause TOP dans linstruction MERGE à cette fin, il est important de comprendre les implications suivantes.
-
Les performances dE / S peuvent être affectées.
Linstruction MERGE effectue une analyse complète de la table des tables source et cible. La division de lopération en lots réduit le nombre dopérations décriture effectuées par lot; cependant, chaque lot effectuera une analyse complète de la table des tables source et cible. Lactivité de lecture qui en résulte peut affecter les performances de la requête.
-
Des résultats incorrects peuvent se produire.
Il est important de sassurer que tous les lots successifs ciblent de nouvelles lignes ou un comportement indésirable tel quune insertion incorrecte de lignes dupliquées dans la table cible peut se produire. Cela peut se produire lorsque la table source comprend une ligne qui nétait pas dans un lot cible mais qui était dans la table cible globale.
-
Pour garantir des résultats corrects:
- Utilisez la clause ON pour déterminer quelles lignes source affectent les lignes cibles existantes et lesquelles sont réellement nouvelles.
- Utilisez une condition supplémentaire dans la clause WHEN MATCHED pour déterminer si la ligne cible a déjà été mise à jour par un lot précédent.
Étant donné que la clause TOP nest appliquée quaprès lapplication de ces clauses, chaque exécution insère une ligne véritablement sans correspondance ou met à jour une ligne existante.
Bonnes pratiques de chargement en masse
Linstruction MERGE peut être utilisée pour charger efficacement des données dun fichier de données source dans une table cible en spécifiant la clause OPENROWSET(BULK…)
comme source de table. Ce faisant, le fichier entier est traité en un seul lot.
Pour améliorer les performances du processus de fusion en bloc, nous vous recommandons les consignes suivantes:
-
Créez un index clusterisé sur les colonnes de jointure de la table cible.
-
Utilisez les conseils ORDER et UNIQUE de la clause
OPENROWSET(BULK…)
pour spécifier comment le fichier de données source est trié.Par défaut, lopération en bloc suppose que le fichier de données nest pas ordonné. Par conséquent, il est important que les données source soient triées en fonction de lindex clusterisé sur la table cible et que lindicateur ORDER soit utilisé pour indiquer lordre afin que loptimiseur de requêtes puisse générer un plan de requête plus efficace. Les conseils sont validés lors de lexécution; si le flux de données nest pas conforme aux indications spécifiées, une erreur est générée.
Ces consignes garantissent que les clés de jointure sont uniques et lordre de tri des données dans le le fichier source correspond à la table cible. Les performances des requêtes sont améliorées car des opérations de tri supplémentaires ne sont pas nécessaires et des copies de données inutiles ne sont pas nécessaires.
Mesure et diagnostic des performances MERGE
Les fonctionnalités suivantes sont disponibles pour vous aider à mesurer et diagnostiquer les performances des instructions MERGE.
- Utilisez le compteur merge stmt dans la vue de gestion dynamique sys.dm_exec_query_optimizer_info pour renvoyer le nombre doptimisations de requête pour les instructions MERGE.
- Utilisation lattribut merge_action_type dans la vue de gestion dynamique sys.dm_exec_plan_attributes pour renvoyer le type de plan dexécution du déclencheur utilisé à la suite dune instruction MERGE.
- Utilisez SQL Trace pour collecter des données de dépannage pour linstruction MERGE de la même manière vous le feriez pour dautres instructions de langage de manipulation de données (DML). Pour plus dinformations, consultez SQL Trace.
Exemples
A. Utilisation de MERGE pour effectuer des opérations INSERT et UPDATE sur une table dans une seule instruction
Un scénario courant consiste à mettre à jour une ou plusieurs colonnes dans une table si une ligne correspondante existe. Vous pouvez également insérer les données en tant que nouvelle ligne si une ligne correspondante nexiste pas. Vous exécutez généralement lun ou lautre scénario en transmettant des paramètres à une procédure stockée contenant les instructions UPDATE et INSERT appropriées. Avec linstruction MERGE, vous pouvez effectuer les deux tâches dans une seule instruction. Lexemple suivant montre une procédure stockée dans la base de données AdventureWorks2012 qui contient à la fois une instruction INSERT et une instruction UPDATE. La procédure est ensuite modifiée pour exécuter les opérations équivalentes à laide dune seule instruction MERGE.
B . Utilisation de MERGE pour effectuer des opérations UPDATE et DELETE sur une table dans une seule instruction
Lexemple suivant utilise MERGE pour mettre à jour la table ProductInventory
dans la base de données exemple AdventureWorks2012, tous les jours, en fonction des commandes traitées dans le tableau SalesOrderDetail
. La colonne Quantity
de la ProductInventory
est mis à jour en soustrayant le nombre de commandes passées chaque jour pour chaque produit dans le SalesOrderDetail
table. Si le nombre de commandes pour un produit réduit le niveau dinventaire dun produit à 0 ou moins, la ligne de ce produit est supprimée du tableau ProductInventory
.
C. Utilisation de MERGE pour effectuer des opérations UPDATE et INSERT sur une table cible à laide dune table source dérivée
Lexemple suivant utilise MERGE pour modifier la table SalesReason
dans la base de données AdventureWorks2012 en mettant à jour ou en insérant des lignes. Lorsque la valeur de NewName
dans la table source correspond à une valeur de la colonne Name
de la table cible, (SalesReason
), la colonne ReasonType
est mise à jour dans la table cible. Lorsque la valeur de NewName
ne correspond pas, la ligne source est insérée dans la table cible. La table source est une table dérivée qui utilise le constructeur de valeur de table Transact-SQL pour spécifier plusieurs lignes pour la table source. Pour plus dinformations sur lutilisation du constructeur de valeur de table dans une table dérivée, voir Constructeur de valeur de table (Transact-SQL). Lexemple montre également comment stocker les résultats de la clause OUTPUT dans une variable de table. Et, puis vous résumez les résultats de linstruction MERGE en exécutant une simple opération de sélection qui renvoie le nombre de lignes insérées et mises à jour.
D.Insertion des résultats de linstruction MERGE dans une autre table
Lexemple suivant capture les données renvoyées par la clause OUTPUT dune instruction MERGE et insère ces données dans une autre table. Linstruction MERGE met à jour la colonne Quantity
de la table ProductInventory
dans la base de données AdventureWorks2012, en fonction des commandes traitées dans SalesOrderDetail
. Lexemple capture les lignes mises à jour et les insère dans une autre table qui « est utilisée pour suivre les changements dinventaire.
E. Utilisation de MERGE pour faire INSERT ou UPDATE sur une table darêtes cible dans une base de données de graphes
Dans cet exemple, vous créez des tables de nœuds Person
et City
et un table darêtes livesIn
. Vous utilisez linstruction MERGE sur larête livesIn
et insérez une nouvelle ligne si larête nexiste pas déjà entre un Person
et City
. Si larête existe déjà, il vous suffit de mettre à jour lattribut StreetAddress sur larête livesIn
.