AK EXISTUJE a KOREŠPONDENCIE Vyhlásenie

0

Otázka

Mám údajov prúdi do jednej tabuľky z viacerých iných tabuľkách povedzme: Table_A Potom som sa majú Zlúčiť uložené proc, že trvá údaje z tabuľky A spojí ho s Tabuľke B.

Avšak, niečo sa nezdá byť správny. Ak som sa skráti a načítať údaje funguje to v pohode, ale ak nemám truncate a zaťaženia, a len priniesla požiadavku eachh hodinu som sa zobrazí chybové hlásenie,

Msg 8672, Úroveň 16, Štát 1, Postup Merge_Table_A Linka 4 [Dávky Začať Riadok 0] ZLÚČENIE vyhlásenie pokus AKTUALIZOVAŤ alebo ODSTRÁNIŤ, v tom istom riadku, viac ako raz. Toto sa stane, keď sa cieľ riadok zodpovedá viac ako jedného zdroja riadka. ZLUČOVACIE vyhlásenie nemôže AKTUALIZOVAŤ alebo ODSTRÁNIŤ istom riadku cieľovej tabuľky viackrát. Upraviť NA ustanovenie na zabezpečenie cieľa riadok zodpovedá najviac jeden zdroj riadok, alebo použite SKUPINE odsek na skupiny zdrojových riadkov.

Ako môžem prekonať to?

Chcem byť schopní postupne načítať údaje a nie je to truncate zaťaženie, ale zároveň mať uložené proc, že aktualizácie alebo vložky alebo nestará ak riadok už existuje.

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

Najlepšiu odpoveď

1

Zdá máte duplicitné riadky vo vašej cieľovej tabuľky, ktoré sú načítané z vášho predchádzajúceho beží.

Poznámka: Zodpovedajúce v Zlúčiť nepovažuje riadkov vložená (aj duplikát), zatiaľ čo beží Zlúčenie sám.

Nižšie je moja repro príklad s vzorové údaje:

Tabuľka1: Počiatočné údaje

enter image description here

Tab. č.: 2: Taget tabuľka

enter image description here

Zlúčiť Výrok:

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;

Keď Korešpondencie je popravený, vloží všetky údaje bez akejkoľvek chyby.

enter image description here

Nové údaje v tb1:

enter image description here

Keď som spustiť Zlúčiť vyhlásenie, dáva mi rovnakú chybu ako vy.

enter image description here

Ako riešenie použiť niektorú z nižšie uvedených možností

  1. Pridať ďalšie podmienky, ak je to možné, sa v doložke na jedinečnú identifikáciu údajov.

  2. Odstrániť duplicitné záznamy zo zdroja a zlúčiť údaje do tb2 ako je uvedené nižšie.

     --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;
    

Údaje zlúčiť do tb2 úspešne.

enter image description here

2021-12-02 12:52:40

V iných jazykoch

Táto stránka je v iných jazykoch

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