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?

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top