it-swarm-eu.dev

UPSERT - Existuje lepší alternativa k MERGE nebo @@ rowcount?

Zajímalo by mě, jestli jste narazili na příkaz T-SQL podobný konceptu UPSERT? Provádění operací INSERT | UPDATE pomocí voleb (1) nebo (2) se zdá být příliš složité a náchylné k chybám.

[~ # ~] cíl [~ # ~]

Aby se zajistilo, že požadovaný záznam (v tomto případě zaměstnanec 1) je aktuální, aniž by bylo nutné v podstatě stejný dotaz psát dvakrát.

[~ # ~] kontext [~ # ~]

  • název tabulky: zaměstnanec
  • iD zaměstnance: má primární klíč a identita identity je nastavena na true

[~ # ~] možnosti [~ # ~]

  1. provést SQL UPDATE ... zkontrolovat @@ rowcount = 0 a @@ error = 0 ... provést SQL INSERT, pokud je to potřeba

    • con: musíte skutečně napsat stejný dotaz dvakrát, jednou jako vložení, jednou jako aktualizace
    • con: more code = více času psaní
    • con: more code = více místa pro chybu

https://stackoverflow.com/questions/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Aktualizovat pomocí @@ rowcount"

  1. provést SQL MERGE
    • con: musíte skutečně napsat stejný dotaz dvakrát, jednou jako vložení, jednou jako aktualizace
    • con: more code = více času psaní
    • con: more code = více místa pro chybu

http://technet.Microsoft.com/en-us/library/bb510625.aspx "Sloučení T-SQL"

  1. provést SQL UPSERT (funkce neexistuje)
    • pro: definujete vztah dat k tabulce jednou (ať se SQL Server bude starat o to, zda se jedná o INSERT nebo UPDATE)
    • pro: less code = rychlejší implementace
    • pro: menší kód = nižší pravděpodobnost

PŘÍKLAD UPSERT

Zaměstnanec UPSERT (zaměstnanec, číslo zaměstnance, název_účtu, jméno, prostřední jméno, příjmení, upravené_at) HODNOTY (1, '00 -124AB37', 'Manager', 'John', 'T', 'Smith', GetDate ());

  • pokud Employ_id 1 neexistuje: MS SQL provede příkaz INSERT
  • pokud zaměstnanec číslo 1: MS SQL spustí a UPDATE příkaz
14
Pressacco

Myslím, že jednoduchá odpověď na to není. MERGE byla odpověď společnosti Microsoft na spletitější logiku UPSERT. A ty jsi nejmenoval ani nejhorší přístup:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

Prostě jsem si to trochu píchl do úst, ale ve skutečnosti je to ten, který vidím nejčastěji.

V každém případě, pokud MERGE není pro vás dostatečně flexibilní nebo výkonný, doporučujeme vám odeslat žádost o funkci společnosti Microsoft na http://connect.Microsoft.com/sql/ a důkladně vysvětlete svůj obchodní případ. Dokud se budete držet skutečných výhod navrhované syntaxe oproti MERGE, máte můj hlas. Pokud příliš visíte na části „náchylné k chybám“, nejspíš si koupím. Proč? Protože můžete zatloukat jakékoli prohlášení.

To znamená, že si nemyslím, že pro vás může někdo udělat něco konkrétního. Měli byste prozkoumat možné problémy s programem MERGE:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

14
Aaron Bertrand