UPSERT - Gibt es eine bessere Alternative zu MERGE oder @@ rowcount? [geschlossen]

14

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

  1. 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"

  1. 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"

  1. 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
Pressacco
quelle
4
Dies scheint eine Funktionsanforderung für Microsoft zu sein, die Ihnen hier nicht weiterhelfen kann. Die von Microsoft entwickelte Lösung ist MERGE. Wenn das für Sie nicht flexibel / leistungsfähig genug ist, dann brauchen Sie eine andere Lösung, die es noch nicht gibt.
Aaron Bertrand
3
Meiner Meinung nach MERGEist es unkompliziert, flexibel und gehört auch zum SQL-Standard. Das eigentliche Problem bei MERGEund bei anderen UPSERTImplementierungen ist eine potenzielle Sperreneskalation oder sogar Deadlocks, die nichts mit der Syntax zu tun haben.
a1ex07,
Wenn Sie eine Frage haben, können Sie diese gerne stellen. Wie bereits geschrieben, handelt es sich hier im Grunde genommen um eine Schande über die MERGEImplementierung in SQL Server.
JNK,
Gute Frage - Gibt es im Wesentlichen eine UPSERT-Anweisung, bei der sich der Server Gedanken darüber macht, ob ein Insert oder ein Update erforderlich ist? Ich stimme zu, MERGE erfüllt nicht das, was Sie logischerweise von einer Implementierung von "UPSERT" erwarten würden. Angesichts der Tatsache, dass sich MS für die Implementierung auf diese Weise entschieden hat, würde meine Frage lauten: Was hätte ein Mangel oder eine Unmöglichkeit für die Implementierung sein können, wenn sie versucht hätten, die von Ihnen (und mir) gewünschte Syntax zu implementieren?
youcantryreachingme

Antworten:

14

Ich denke, die einfache Antwort darauf ist nein. MERGEwar die Antwort von Microsoft auf die komplexere UPSERTLogik. Und Sie haben nicht einmal den schlechtesten Ansatz aufgeführt:

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

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 MERGEschlage 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 halten MERGE, 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 untersuchenMERGE :

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

Aaron Bertrand
quelle
2
Vielen Dank, Aaron. Ich habe die T-SQL-Dokumentation zu MSDN durchgesehen und konnte nicht finden, wonach ich gesucht habe. Ich dachte nur, ich würde es rausschmeißen, falls ich etwas verpasst hätte. Während die MERGE-Anweisung in bestimmten Situationen sinnvoll ist, kann ich nicht anders, als zu glauben, dass es ein "Vorschlaghammer ist, einen Nagel einzuschlagen", um eine einfache Sicherungsoperation auszuführen. Vielleicht sollte ich meinen Programmiererhut abnehmen und meinen DBA Fedora aufsetzen. Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Gedanken mit uns zu teilen.
Pressacco