Tsql 合并-如果匹配,则不执行任何操作

Tsql 合并-如果匹配,则不执行任何操作,tsql,Tsql,当条件不匹配时,我需要编写一个MERGE语句来插入数据,当条件匹配时,我希望查询什么都不做,但我必须包含这个条件,因为我迫切需要将两个条件中的源数据捕获到输出表中 这是我的密码: MERGE dm_data_bps.dbo.akcja AS target USING ( SELECT * FROM #CEIDG WHERE isnull(sp_i

当条件不匹配时,我需要编写一个MERGE语句来插入数据,当条件匹配时,我希望查询什么都不做,但我必须包含这个条件,因为我迫切需要将两个条件中的源数据捕获到输出表中

这是我的密码:

                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;

我如何才能实现我的目标?

我不确定我是否会为MERGE语句带来的所有开销而烦恼。看

您可以通过显式事务获得所需的一切

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;

相反,我很确定您可以使用目标表的任何列的自身值来更新它:update set target.x=target.x…旁白:关于isnullsp_id,您正在创建一个不必要的性能拖动。看看这里@Eric非常感谢,很显然,只写sp_id就足够了,返回的行数也是一样的,但由于使用了索引查找,性能要好得多。@Zohar,你说得完全正确,它是这样工作的。我认为有一种方法可以避免执行任何操作,从而不会影响性能。但是,请注意,update语句仍将被执行-从性能方面来说,可能有更好的方法来获得您所需要的。