2

I need to write a MERGE statement to insert data WHEN NOT MATCHED condition, WHEN MATCHED I'd like the query to do nothing but I've got to include this condition because I badly need to catch the source data from both conditions into my output table.

Here's my code:

                MERGE dm_data_bps.dbo.akcja AS target
            USING (
                SELECT *
                FROM #CEIDG
                WHERE isnull(sp_id, '') <> ''
                ) AS source
                ON target.ak_id = source.ceidg_ak_id
            WHEN NOT MATCHED
                THEN
                    INSERT (
                        ak_akt_id
                        ,ak_sp_id
                        ,ak_kolejnosc
                        ,ak_interwal
                        ,ak_zakonczono
                        ,ak_pr_id
                        ,ak_publiczna
                        )
                    VALUES (
                        1246
                        ,sp_id
                        ,0
                        ,0
                        ,getdate()
                        ,5
                        ,1
                        )
            WHEN MATCHED
                THEN
                    UPDATE
                    <DO NOTHING>
            OUTPUT inserted.ak_id
                ,source.Firma
                ,source.AdresPocztyElektronicznej
                ,source.AdresStronyInternetowej
                ,source.IdentyfikatorWpisu
                ,source.DataRozpoczeciaWykonywaniaDzialalnosciGospodarczej
                ,source.DataZawieszeniaWykonywaniaDzialalnosciGospodarczej
                ,source.DataWznowieniaWykonywaniaDzialalnosciGospodarczej
                ,source.DataZaprzestaniaWykonywaniaDzialalnosciGospodarczej
                ,source.DataWykresleniaWpisuZRejestru
                ,source.MalzenskaWspolnoscMajatkowa
                ,source.SpolkiCywilneKtorychWspolnikiemJestPrzedsiebiorcaNIP
                ,source.SpolkiCywilneKtorychWspolnikiemJestPrzedsiebiorcaREGON
                ,source.Zakazy
                ,source.InformacjeDotyczaceUpadlosciPostepowaniaNaprawczego
                ,source.Sukcesja
                ,source.AdresGlownegoMiejscaWykonywaniaDzialalnosci
                ,source.AdresyDodatkowychMiejscWykonywaniaDzialalnosci
                ,source.AdresyDodatkowychMiejscWykonywaniaDzialalnosci2
                ,source.AdresDoDoreczen
                ,source.STATUS
            INTO #ceidg_ak_id;

How can I accomplish my goal?

Arkadiusz
  • 369
  • 5
  • 18
  • 3
    Instead of ``, I'm pretty sure you can update any column of the target table with it's own value: `update set target.x = target.x`... – Zohar Peled Oct 31 '19 at 11:37
  • 2
    Aside: Regarding `isnull(sp_id, '') <> ''`, you're creating an unnecessary performance drag. Have a look here. https://stackoverflow.com/a/3118256/5790584 – Eric Brandt Oct 31 '19 at 13:59
  • @Eric many thanks, it stands to reason that it's sufficient to write only sp_id<>'', it amounts to the same when it comes to number of rows returned but performance it much better due to use of a index seek. – Arkadiusz Oct 31 '19 at 14:10
  • @Zohar, you're absolutely right, it works that way. I've thought that there's a way around not to do any operation so that not to hurt performance. – Arkadiusz Oct 31 '19 at 14:12
  • 1
    Please note, however, that the update statement will still be executed - there are probably better ways (in terms of performance) to get what you need. – Zohar Peled Oct 31 '19 at 14:18

1 Answers1

2

I'm not sure I'd bother with all of the overhead that comes with a MERGE statement. See Use Caution with SQL Server's MERGE Statement.

You can get everything you need with an explicit transaction.

BEGIN TRANSACTION;

UPDATE
  target
SET
  ak_akt_id = 1246
 ,ak_sp_id = sp_id
 ,ak_kolejnosc = 0
 ,ak_interwal = 0
 ,ak_zakonczono = GETDATE()
 ,ak_pr_id = 5
 ,ak_publiczna = 1
FROM
  dm_data_bps.dbo.akcja AS target
JOIN
  (SELECT * FROM #CEIDG WHERE sp_id <> '') AS source
    ON
    target.ak_id = source.ceidg_ak_id;

SELECT
  Firma
 ,AdresPocztyElektronicznej
 ,AdresStronyInternetowej
 ,IdentyfikatorWpisu
 ,DataRozpoczeciaWykonywaniaDzialalnosciGospodarczej
 ,DataZawieszeniaWykonywaniaDzialalnosciGospodarczej
 ,DataWznowieniaWykonywaniaDzialalnosciGospodarczej
 ,DataZaprzestaniaWykonywaniaDzialalnosciGospodarczej
 ,DataWykresleniaWpisuZRejestru
 ,MalzenskaWspolnoscMajatkowa
 ,SpolkiCywilneKtorychWspolnikiemJestPrzedsiebiorcaNIP
 ,SpolkiCywilneKtorychWspolnikiemJestPrzedsiebiorcaREGON
 ,Zakazy
 ,InformacjeDotyczaceUpadlosciPostepowaniaNaprawczego
 ,Sukcesja
 ,AdresGlownegoMiejscaWykonywaniaDzialalnosci
 ,AdresyDodatkowychMiejscWykonywaniaDzialalnosci
 ,AdresyDodatkowychMiejscWykonywaniaDzialalnosci2
 ,AdresDoDoreczen
 ,STATUS
INTO
  #ceidg_ak_id
FROM
  #CEIDG
WHERE
  sp_id <> '';

COMMIT TRANSACTION;
Eric Brandt
  • 7,886
  • 3
  • 18
  • 35