738 Stimmen

Lösungen für INSERT OR UPDATE auf SQL Server

Nehmen wir eine Tabellenstruktur von MyTable(KEY, datafield1, datafield2...) .

Häufig möchte ich entweder einen vorhandenen Datensatz aktualisieren oder einen neuen Datensatz einfügen, wenn dieser noch nicht existiert.

Im Wesentlichen:

IF (key exists)
  run update command
ELSE
  run insert command

Wie kann man das am besten schreiben?

53 Stimmen

Für alle, die diese Frage zum ersten Mal stellen - bitte lesen Sie unbedingt alle Antworten und Kommentare. Das Alter kann manchmal zu irreführenden Informationen führen...

1 Stimmen

Erwägen Sie die Verwendung des EXCEPT-Operators, der in SQL Server 2005 eingeführt wurde.

-3voto

Micky McQuade Punkte 1863

Normalerweise tue ich das, was einige der anderen Poster gesagt haben, indem ich zuerst prüfe, ob es existiert, und dann den richtigen Weg einschlage. Eine Sache, die Sie dabei beachten sollten, ist, dass der von Sql zwischengespeicherte Ausführungsplan für den einen oder anderen Pfad nicht optimal sein könnte. Ich glaube, der beste Weg, dies zu tun ist, zwei verschiedene gespeicherte Prozeduren aufzurufen.

FirstSP:
If Exists
   Call SecondSP (UpdateProc)
Else
   Call ThirdSP (InsertProc)

Ich befolge meine eigenen Ratschläge nicht sehr oft, also nehmen Sie sie mit Vorsicht zur Kenntnis.

0 Stimmen

Dies mag in früheren Versionen von SQL Server relevant gewesen sein, aber moderne Versionen haben eine Kompilierung auf Anweisungsebene. Forks usw. sind kein Problem, und die Verwendung separater Prozeduren für diese Dinge löst keines der Probleme, die mit der Wahl zwischen einer Aktualisierung und einer Einfügung verbunden sind...

-3voto

Luke Bennett Punkte 32186

Ein if exists ... else ... erfordert mindestens zwei Anfragen (eine zur Prüfung, eine zur Durchführung einer Aktion). Der folgende Ansatz erfordert nur eine, wenn der Datensatz existiert, zwei, wenn eine Einfügung erforderlich ist:

DECLARE @RowExists bit
SET @RowExists = 0
UPDATE MyTable SET DataField1 = 'xxx', @RowExists = 1 WHERE Key = 123
IF @RowExists = 0
  INSERT INTO MyTable (Key, DataField1) VALUES (123, 'xxx')

-10voto

Clint Ecker Punkte 1454

Führen Sie eine Auswahl durch, wenn Sie ein Ergebnis erhalten, aktualisieren Sie es, wenn nicht, erstellen Sie es.

3 Stimmen

Das sind zwei Aufrufe an die Datenbank.

3 Stimmen

Darin sehe ich kein Problem.

10 Stimmen

Das Problem sind die zwei Aufrufe an die DB, die die Anzahl der Hin- und Rückflüge zur DB verdoppeln. Wenn die App die DB mit vielen Einfügungen/Aktualisierungen trifft, wird es die Leistung beeinträchtigen. UPSERT ist eine bessere Strategie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X