Zastanawiałem się, czy napotkałeś polecenie T-SQL podobne do koncepcji UPSERT? Wykonywanie operacji INSERT | UPDATE przy użyciu opcji (1) lub (2) wydaje się zbyt skomplikowane i podatne na błędy.
CEL
Aby upewnić się, że żądany rekord (w tym przypadku identyfikator_użytkownika 1) jest aktualny BEZ konieczności zasadniczo dwukrotnego napisania tego samego zapytania.
KONTEKST
- nazwa tabeli: pracownik
- identyfikator pracownika: ma klucz podstawowy, a właściwość tożsamości ma wartość true
OPCJE
wykonaj aktualizację SQL ... sprawdź @@ rowcount = 0 i @@ error = 0 ... w razie potrzeby uruchom SQL INSERT
- con: musisz efektywnie napisać to samo zapytanie dwukrotnie, raz jako wstawka, raz jako aktualizacja
- con: więcej kodu = więcej czasu na pisanie
- con: więcej kodu = więcej miejsca na błąd
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure „Aktualizuj za pomocą @@ rowcount”
- wykonać scalenie SQL
- con: musisz efektywnie napisać to samo zapytanie dwukrotnie, raz jako wstawka, raz jako aktualizacja
- con: więcej kodu = więcej czasu na pisanie
- con: więcej kodu = więcej miejsca na błąd
http://technet.microsoft.com/en-us/library/bb510625.aspx „Scalanie T-SQL”
- wykonać SQL UPSERT (funkcja nie istnieje)
- pro: definiujesz relację danych do tabeli raz (pozwól, aby SQL Server martwił się, czy jest to INSERT czy UPDATE)
- pro: mniej kodu = szybsza implementacja
- pro: mniej kodu = niższe prawdopodobieństwo
PRZYKŁAD UPSERT
UPSERT pracownik (identyfikator pracownika, numer pracownika, tytuł pracy, imię, drugie imię, nazwisko, zmieniona nazwa) WARTOŚCI (1, „00-124AB37”, „Menedżer”, „John”, „T”, „Smith”, GetDate ());
- jeśli identyfikator pracownika 1 nie istnieje: MS SQL wykonuje instrukcję INSERT
- jeśli identyfikator pracownika 1 istnieje: wykonuje się MS SQL i instrukcja UPDATE
MERGE
jest prosty, elastyczny, a także jest częścią SQL Standard. Prawdziwym problemem MERGE
i innymi UPSERT
implementacjami jest potencjalna eskalacja blokady, a nawet zakleszczenia, które nie mają nic wspólnego ze składnią.
MERGE
implementacji w SQL Server.