Ich habe mich gefragt, ob Sie auf einen T-SQL-Befehl gestoßen sind, der dem Konzept von UPSERT ähnelt. Die Ausführung von INSERT | UPDATE-Vorgängen mit den Optionen (1) oder (2) erscheint zu komplex und fehleranfällig.
ZIELSETZUNG
Um sicherzustellen, dass der gewünschte Datensatz (in diesem Fall employee_id 1) aktuell ist, OHNE im Wesentlichen zweimal dieselbe Abfrage schreiben zu müssen.
KONTEXT
- Tabellenname: Mitarbeiter
- Mitarbeiter-ID: Hat einen Primärschlüssel, und die Identität ist auf true festgelegt
OPTIONEN
Führen Sie ein SQL-UPDATE aus. Überprüfen Sie @@ rowcount = 0 und @@ error = 0. Führen Sie bei Bedarf SQL INSERT aus
- con: Sie müssen dieselbe Abfrage effektiv zweimal schreiben, einmal als Einfügung, einmal als Aktualisierung
- con: more code = mehr Zeit für die Eingabe
- con: more code = mehr Raum für Fehler
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Update using @@ rowcount"
- Führe eine SQL MERGE aus
- con: Sie müssen dieselbe Abfrage effektiv zweimal schreiben, einmal als Einfügung, einmal als Aktualisierung
- con: more code = mehr Zeit für die Eingabe
- con: more code = mehr Raum für Fehler
http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"
- SQL UPSERT ausführen (Feature existiert nicht)
- pro: Sie definieren die Daten-zu-Tabelle-Beziehung einmal (lassen Sie SQL Server sich Gedanken darüber machen, ob es sich um ein INSERT oder ein UPDATE handelt)
- pro: weniger Code = schnellere Implementierung
- pro: weniger code = geringere wahrscheinlichkeit
UPSERT BEISPIEL
UPSERT-Mitarbeiter (Mitarbeiter_ID, Mitarbeiternummer, Job_Titel, Vorname, Vorname, Nachname, geänderter_Zeichen) WERTE (1, '00 -124AB37 ',' Manager ',' John ',' T ',' Smith ', GetDate ());
- Wenn employee_id 1 nicht vorhanden ist: MS SQL führt eine INSERT-Anweisung aus
- Wenn employee_id 1 vorhanden ist, wird MS SQL ausgeführt und die UPDATE-Anweisung ausgeführt
MERGE
ist es unkompliziert, flexibel und gehört auch zum SQL-Standard. Das eigentliche Problem bei MERGE
und bei anderen UPSERT
Implementierungen ist eine potenzielle Sperreneskalation oder sogar Deadlocks, die nichts mit der Syntax zu tun haben.
MERGE
Implementierung in SQL Server.