Insert et Update en une seule fois avec MERGE

vendredi, mars 26, 2010
By Benjamin VESAN in SQL Server (bvesan@capdata-osmozium.com) [41 article(s)]

Combien de fois le doute s’installe : Les lignes existent-elles des 2 cotés ? Jusqu’à la version 2005, la méthode
consistait à faire un select , puis si la ligne n’existait pas dans l’autre table on l’insérait, sinon on la mettait à jour.
Depuis la version 2008, Sql server nous propose de faire tout ça en une seule passe grâce à l’instruction MERGE.

CREATE TABLE clients (client_id INT PRIMARY KEY, client_nom VARCHAR(10), client_prenom VARCHAR(10), Date_naissance DATETIME) CREATE TABLE prospects ( prospect_id INT PRIMARY KEY, prospect_nom VARCHAR(10), prospect_prenom
VARCHAR(10), Date_naissance DATETIME)

INSERT INTO clients VALUES
(1,'Dupont', 'Guy','1988-01-01'), (3,'Durand', 'Nicole','1990-03-10'), (5,'Erie', 'Caroline','1984-11-22'), (7,'Toche', 'vincent','1977-07-07'), (8,'Lagerec', 'Isabelle','1989-05-08') 
INSERT INTO prospects VALUES 
(1,'Dupont', 'Guy','1977-02-02'),(2,'Kyle', 'Dorine','1981-11-11'), (4,'Ravole', 'Nicolas','1982-02-06'),(5,'Erie', 'Caroline','1984-12-05'), (6,'Kent', 'Cyril','1982-07-15')
MERGE clients USING prospects ON (clients.client_id=prospects.prospect_id) WHEN NOT MATCHED THEN INSERT
values (prospects.prospect_id,prospects.prospect_nom, prospects.prospect_prenom,prospects.Date_naissance) WHEN MATCHED THEN UPDATE SET clients.Date_naissance=prospects.Date_naissance;

On retrouve bien les lignes de la table prospects et les lignes de la table clients qui ont été modifiés.
Au niveau syntaxique, il faut simplement penser au ;

Continuez votre lecture sur le blog :




Cliquer pour partager cet article sur Viadeo
Cliquer sur "CAPTURER" pour sauvegarder cet article dans Evernote Clip to Evernote

Tags: , , , ,

3 Responses to “Insert et Update en une seule fois avec MERGE”

  1. Thierry

    Je connais cette instruction depuis Oracle 9i je crois …:).

    #317
  2. luigi33

    Interressant…
    encore plus si on y associe la clause OUTPUT pour de l’audite par exemple
    Par contre y a t’il des possibilité de filtrer encore plus l’update.
    C’est à dire, de ne mettre à jour que sous certaines condition suplémentaire aux critères INSERT/UPDATE

    #389
  3. guillaume

    oui il est possible d’ajouter des clauses :
    [ WHEN MATCHED [ AND ]

    on peut aussi faire ce genre de choses :
    WHEN MATCHED AND client_nom = ‘Toche’ THEN DELETE
    WHEN MATCHED AND client_nom = ‘Kent’ THEN UPDATE SET prenom_client = ‘louis’

    #391

Leave a Reply