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
quelle
MERGE
ist es unkompliziert, flexibel und gehört auch zum SQL-Standard. Das eigentliche Problem beiMERGE
und bei anderenUPSERT
Implementierungen ist eine potenzielle Sperreneskalation oder sogar Deadlocks, die nichts mit der Syntax zu tun haben.MERGE
Implementierung in SQL Server.Antworten:
Ich denke, die einfache Antwort darauf ist nein.
MERGE
war die Antwort von Microsoft auf die komplexereUPSERT
Logik. Und Sie haben nicht einmal den schlechtesten Ansatz aufgeführt:Ich habe mich nur ein wenig in den Mund gekotzt, um das zu tippen, aber es ist tatsächlich das, was ich am häufigsten sehe.
In jedem Fall
MERGE
schlage ich vor, dass Sie eine Funktionsanforderung an Microsoft senden , wenn dies für Sie nicht flexibel oder leistungsfähig genug ist http://connect.microsoft.com/sql/ zu und Ihren Geschäftsfall ausführlich zu erläutern ist. Solange Sie sich an die wirklichen Vorteile Ihrer vorgeschlagenen Syntax haltenMERGE
, haben Sie meine Stimme. Wenn Sie sich zu sehr mit dem "fehleranfälligen" Teil beschäftigen, ist es unwahrscheinlich, dass ich mich anmelde. Warum? Da kann man jede Aussage fett fingern.Das heißt, ich glaube nicht, dass irgendjemand hier etwas speziell für Sie tun kann. Sie sollten die potenziellen Probleme mit untersuchen
MERGE
:http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
quelle