SI il EXISTE et de l'Instruction MERGE

0

La question

J'ai des données circulant dans une table à partir de plusieurs autres tables permet de dire: Table_A Ensuite, j'ai un Fusion procédure stockée qui prend les données de la table A fusionne avec le Tableau B.

Cependant, quelque chose ne semble pas être de droite. Si je tronquer et de charger les données, il fonctionne très bien, mais si je n'ai pas tronquer et de la charge, et extraire seulement la requête par eachh heure, j'obtiens le message d'erreur disant:

Msg 8672, Niveau 16, État 1, Procédure Merge_Table_A, Ligne 4 [Lot De La Ligne De Départ 0] L'instruction MERGE tenté de mettre à JOUR ou SUPPRIMER la même ligne plus d'une fois. Cela se produit lorsqu'une ligne cible correspond à plus d'une ligne source. Une instruction MERGE ne peut pas mettre à JOUR/SUPPRIMER la même ligne de la table cible à plusieurs reprises. Affiner la clause d'assurer une ligne cible correspond au plus une ligne source, ou de l'utilisation de la clause GROUP BY pour regrouper les lignes source.

Comment puis-je surmonter cela?

Je veux être en mesure de mettre à charger les données et ne pas tronquer les charges, mais dans le même temps, une procédure stockée que les mises à jour ou des inserts ou ne s'inquiète pas si la ligne existe déjà.

azure sql-merge sql-server
2021-11-24 01:52:34
1

La meilleure réponse

1

Semble que vous avez des lignes en double dans votre table cible qui sont chargés à partir de vos courses précédentes.

Remarque: la mise en Correspondance dans une Fusion ne considère pas les lignes insérées (même en double) lors de l'exécution de la Fusion elle-même.

Ci-dessous est ma repro exemple avec un échantillon de données:

Tableau 1: données Initiales

enter image description here

Table2: Taget table

enter image description here

Merge:

MERGE tb2 AS Target
USING tb1   AS Source
 ON Source.firstname = Target.firstname and 
    Source.lastname = Target.lastname 

-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (firstname, lastname, updated_date) 
VALUES (Source.firstname, Source.lastname, source.updated_date)

-- For Updates
WHEN MATCHED THEN UPDATE SET
   Target.updated_date      = Source.updated_date

-- For Deletes
WHEN NOT MATCHED BY Source THEN
DELETE;

Lorsque l'opération de Fusion est exécuté, il insère toutes les données sans erreurs.

enter image description here

De nouvelles données dans tb1:

enter image description here

Lorsque j'exécute l'instruction Merge, il me donne la même erreur que le vôtre.

enter image description here

Comme une solution de contournement en utilisant l'une des options ci-dessous,

  1. Ajouter des conditions supplémentaires si possible dans la clause d'identifier de manière unique les données.

  2. Supprimer les doublons à partir de la source et la fusion des données dans tb2 comme ci-dessous.

     --temp table
     drop table if exists #tb1;
    
     select *  into #tb1 from (
         select *, row_number() over(partition by firstname, lastname order by firstname, lastname, updated_date desc) as rn from tb1) a
     where rn = 1 
    
     MERGE tb2 AS Target
     USING #tb1 AS Source
      ON Source.firstname = Target.firstname and 
         Source.lastname = Target.lastname 
    
     -- For Inserts
     WHEN NOT MATCHED BY Target THEN
     INSERT (firstname, lastname, updated_date) 
       VALUES (Source.firstname, Source.lastname, source.updated_date)
    
     -- For Updates
     WHEN MATCHED THEN UPDATE SET
        Target.updated_date     = Source.updated_date
    
     -- For Deletes
     WHEN NOT MATCHED BY Source THEN
       DELETE;
    

Les données fusionnées dans tb2 avec succès.

enter image description here

2021-12-02 12:52:40

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................