it-swarm.com.de

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

Ich habe mich gefragt, ob Sie auf einen T-SQL-Befehl gestoßen sind, der dem Konzept von UPSERT ähnelt. Das Ausführen von INSERT | UPDATE-Operationen mit den Optionen (1) oder (2) erscheint zu komplex und fehleranfällig.

[~ # ~] Ziel [~ # ~]

Um sicherzustellen, dass der gewünschte Datensatz (in diesem Fall employee_id 1) auf dem neuesten Stand ist, ohne dass im Wesentlichen dieselbe Abfrage zweimal geschrieben werden muss.

[~ # ~] Kontext [~ # ~]

  • tabellenname: Mitarbeiter
  • mitarbeiter-ID: hat einen Primärschlüssel und die Identitätssicherheit ist auf true gesetzt

[~ # ~] 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 Update
    • con: mehr Code = mehr Zeit für die Eingabe
    • con: mehr Code = mehr Raum für Fehler

https://stackoverflow.com/questions/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Update mit @@ rowcount"

  1. führen Sie eine SQL-Zusammenführung aus
    • con: Sie müssen dieselbe Abfrage effektiv zweimal schreiben, einmal als Einfügung, einmal als Update
    • con: mehr Code = mehr Zeit für die Eingabe
    • con: mehr Code = mehr Raum für Fehler

http://technet.Microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"

  1. führen Sie eine SQL-UPSERT aus (Funktion 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 oder nicht).
    • pro: weniger Code = schnellere Implementierung
    • pro: weniger Code = geringere Wahrscheinlichkeit

UPSERT-BEISPIEL

UPSERT-Mitarbeiter (Mitarbeiter-ID, Mitarbeiternummer, Jobtitel, Vorname, zweiter Vorname, Nachname, modifizierter_at) VALUES (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: MS SQL wird ausgeführt und UPDATE-Anweisung
14
Pressacco

Ich denke, die einfache Antwort darauf lautet nein. MERGE war Microsofts Antwort auf die kompliziertere UPSERT Logik. Und Sie haben nicht einmal den schlechtesten Ansatz aufgelistet:

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

Ich habe mich nur ein wenig in den Mund geworfen, um das zu tippen, aber es ist tatsächlich das, was ich am häufigsten sehe.

Wenn MERGE für Sie nicht flexibel oder leistungsfähig genug ist, empfehlen wir Ihnen auf jeden Fall, eine Funktionsanforderung an Microsoft unter http://connect.Microsoft.com/sql/ und zu senden Erklären Sie Ihren Business Case gründlich. Solange Sie sich an die wirklichen Vorteile Ihrer vorgeschlagenen Syntax gegenüber MERGE halten, haben Sie meine Stimme. Wenn Sie zu viel an dem "fehleranfälligen" Teil hängen, kaufe ich mich nicht so wahrscheinlich ein. Warum? Weil Sie jede Aussage fetten können.

Trotzdem glaube ich nicht, dass irgendjemand hier etwas speziell für Sie tun kann. Sie sollten die möglichen Probleme mit MERGE untersuchen:

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

14
Aaron Bertrand