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
źródło
MERGE
jest prosty, elastyczny, a także jest częścią SQL Standard. Prawdziwym problememMERGE
i innymiUPSERT
implementacjami jest potencjalna eskalacja blokady, a nawet zakleszczenia, które nie mają nic wspólnego ze składnią.MERGE
implementacji w SQL Server.Odpowiedzi:
Myślę, że prosta odpowiedź na to pytanie brzmi „nie”.
MERGE
była odpowiedzią Microsoftu na bardziej skomplikowanąUPSERT
logikę. I nawet nie wymieniłeś najgorszego podejścia:Właśnie zwymiotowałem w ustach, trochę to pisząc, ale tak naprawdę to ten, który najczęściej widuję.
W każdym razie, jeśli
MERGE
nie jest wystarczająco elastyczny lub wydajny, sugeruję przesłanie żądania funkcji do firmy Microsoft pod adresem http://connect.microsoft.com/sql/ i dokładne wyjaśnienie swojego uzasadnienia biznesowego. Tak długo, jak trzymasz się prawdziwych zalet proponowanej składniMERGE
, masz mój głos. Jeśli zwiesisz zbyt dużo na części „podatnej na błędy”, raczej nie kupię. Dlaczego? Ponieważ możesz wyciągnąć gruby palec z każdego oświadczenia.To powiedziawszy, nie sądzę, żeby ktokolwiek tutaj mógł coś dla ciebie zrobić. Powinieneś zbadać potencjalne problemy z
MERGE
:http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
źródło