Einfügen / Aktualisieren auf SQL Server 2005 ohne Verwendung von gespeicherten Prozeduren
-
06-07-2019 - |
Frage
Ich versuche, das klassische Insert / Update-Szenario zu tun, wo ich vorhandene Zeilen in einer Datenbank aktualisieren oder sie einsetzen, wenn sie nicht da sind.
Ich habe eine vorherige Frage zum Thema , aber es befasst sich mit gespeicherten Prozeduren, die ich nicht verwenden. Ich möchte einfach nur SQL SELECT, INSERT und UPDATE-Anweisungen verwenden, es sei denn, es ist etwas besser verfügbar (die Anweisung MERGE ist in SQL Server nicht verfügbar 2005).
Ich denke, meine allgemeine Idee ist diese:
If the row is found
update
else
insert
Was für eine Zeile Existenz überprüft, wie teuer ist es eine SELECT-Anweisung zu tun, bevor eine UPDATE oder eine INSERT-Aufruf? Oder ist es besser, nur einen UPDATE versuchen, überprüfen Sie die Anzahl der betroffenen Zeilen, und dann eine INSERT tun, wenn die betroffenen Zeilen 0 ist?
Lösung
Der effizienteste Weg ist, um die UPDATE
zu tun, dann tut einem INSERT
wenn @@rowcount
Null ist, , wie in dieser vorherige Antwort erläutert.
Andere Tipps
(Zunächst einmal -.. Ich würde nicht versuchen, gespeicherte Prozeduren zu vermeiden, wenn es kein guter Grund ist die eine gute Leistung in den meisten Fällen geben)
Sie können es auf diese Weise tun:
- erstellen (temporäre) Tabelle
- geben Sie Ihre Reihen
- führen eine INTERSECT, die die extisting Reihen identifiziert
- aktualisieren Sie Ihre Tabelle mit ihnen
- Ausführen ein, außer dass identifiziert die neuen Zeilen
- ein Einsatz mit diesen Elementen führen
- Drop / löschen Sie (temporäre) Tabelle
Das wird läuft wahrscheinlich schneller, wenn Sie Einfügen / große Mengen von Zeilen zu aktualisieren.
Ganz versteht, dass Ihr Beitrag mit dem Titel wurde „SQL Server 2005“, sondern wollte nur etwas werfen, um zu freuen, wenn / falls Sie SQL Upgrade 2008 Microsoft eine neue MERGE-Anweisung hinzugefügt, die Ihnen die Möglichkeit, Code geben eine DML-Anweisung, die sowohl das Update und Insert tut. Es ist ziemlich cool. Ich habe noch Leistung zu vergleichen und I / O, aber es ist einfach toll ein anderes Werkzeug in der Toolbox zu haben.
Wenn Sie sich immer:
* Die Zeilen Graf
* Insert / Update basierend auf dem Ergebnis
Warum nicht statt:
* Zeile löschen
* Zeile einfügen
Das gleiche Ergebnis und sauberere.
Soweit ich weiß, wenn Sie eine Zeile Update - SQLServer hat eine Delete / Insert sowieso (soweit vorhanden)