Published on

January 29, 2021

Optimisation des opérations de données avec la commande MERGE de SQL Server

Dans un entrepôt de données Microsoft SQL Server typique, il est courant d’effectuer des opérations d’INSERTION, de MISE À JOUR et de SUPPRESSION sur une table cible en faisant correspondre les enregistrements d’une table source. Ce processus peut devenir fastidieux et chronophage lors de l’utilisation de commandes DML distinctes. Cependant, à partir de SQL Server 2008, les développeurs peuvent utiliser la commande MERGE pour rationaliser ces opérations en une seule instruction.

La commande MERGE, similaire à la commande UPSERT dans Oracle, vous permet d’insérer des lignes qui n’existent pas et de mettre à jour les lignes qui existent dans une table cible. Elle combine la séquence de commandes conditionnelles INSERT, UPDATE et DELETE en une seule instruction atomique, améliorant les performances et simplifiant le code.

Voici la syntaxe de l’instruction MERGE :

MERGE <table_cible> [AS TARGET]
USING <table_source> [AS SOURCE]
ON <condition_de_recherche>
[WHEN MATCHED 
   THEN <merge_matched> ]
[WHEN NOT MATCHED [BY TARGET]
   THEN <merge_not_matched> ]
[WHEN NOT MATCHED BY SOURCE
   THEN <merge_matched> ];

L’instruction MERGE fonctionne comme des instructions INSERT, UPDATE et DELETE séparées dans la même instruction. Vous spécifiez un ensemble d’enregistrements “Source” et une table “Cible”, et définissez la condition de jointure entre les deux. Ensuite, vous spécifiez le type de modification de données à effectuer lorsque les enregistrements entre les deux ensembles de données correspondent ou ne correspondent pas.

Voici un exemple d’utilisation de la commande MERGE pour synchroniser une table cible avec une liste mise à jour de produits :

-- Créer une table cible
CREATE TABLE Produits
(
   IDProduit INT PRIMARY KEY,
   NomProduit VARCHAR(100),
   Taux MONEY
) 

-- Insérer des enregistrements dans la table cible
INSERT INTO Produits
VALUES
   (1, 'Thé', 10.00),
   (2, 'Café', 20.00),
   (3, 'Muffin', 30.00),
   (4, 'Biscuit', 40.00)

-- Créer une table source
CREATE TABLE ProduitsMisAJour
(
   IDProduit INT PRIMARY KEY,
   NomProduit VARCHAR(100),
   Taux MONEY
) 

-- Insérer des enregistrements dans la table source
INSERT INTO ProduitsMisAJour
VALUES
   (1, 'Thé', 10.00),
   (2, 'Café', 25.00),
   (3, 'Muffin', 35.00),
   (5, 'Pizza', 60.00)

-- Synchroniser la table cible avec les données actualisées de la table source
MERGE Produits AS CIBLE
USING ProduitsMisAJour AS SOURCE 
ON (CIBLE.IDProduit = SOURCE.IDProduit) 
WHEN MATCHED AND CIBLE.NomProduit <> SOURCE.NomProduit OR CIBLE.Taux <> SOURCE.Taux 
THEN UPDATE SET CIBLE.NomProduit = SOURCE.NomProduit, CIBLE.Taux = SOURCE.Taux 
WHEN NOT MATCHED BY TARGET 
THEN INSERT (IDProduit, NomProduit, Taux) VALUES (SOURCE.IDProduit, SOURCE.NomProduit, SOURCE.Taux)
WHEN NOT MATCHED BY SOURCE 
THEN DELETE 

SELECT * FROM Produits

Après avoir exécuté le code ci-dessus, la table cible (Produits) sera synchronisée avec les données actualisées de la table source (ProduitsMisAJour). L’instruction MERGE mettra à jour les enregistrements existants, insérera de nouveaux enregistrements et supprimera les enregistrements qui n’existent plus dans la table source.

L’instruction MERGE offre plusieurs avantages clés :

  • Amélioration des performances : L’instruction MERGE lit et traite les données une seule fois, par rapport à l’écriture d’instructions INSERT, UPDATE et DELETE séparées qui évaluent et traitent les données plusieurs fois.
  • Code simplifié : L’instruction MERGE combine plusieurs opérations de données en une seule instruction, réduisant la complexité et améliorant la maintenabilité du code.
  • Atomicité : L’instruction MERGE garantit que toutes les modifications de données sont effectuées en une seule opération atomique, évitant les incohérences dans les données.

En utilisant la commande MERGE de SQL Server, les développeurs peuvent rationaliser leurs opérations de données et améliorer l’efficacité de leurs scripts SQL et procédures stockées.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.