Sie suchen im Grunde nach einem Muster einfügen oder aktualisieren manchmal auch als Upsert. bezeichnet
Ich empfehle Folgendes:Muster für SQL Server einfügen oder aktualisieren - Sam Saffron
Für eine Prozedur, die mit einzelnen Zeilen zu tun hat, funktionieren beide Transaktionen gut:
Sam Saffrons erste Lösung (für dieses Schema angepasst):
begin tran
if exists (
select *
from mytable with (updlock,serializable)
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c
)
begin
update mytable
set col_d = @val_d
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c;
end
else
begin
insert into mytable (col_a, col_b, col_c, col_d)
values (@val_a, @val_b, @val_c, @val_d);
end
commit tran
Zweite Lösung von Sam Saffron (für dieses Schema angepasst):
begin tran
update mytable with (serializable)
set col_d = @val_d
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c;
if @@rowcount = 0
begin
insert into mytable (col_a, col_b, col_c, col_d)
values (@val_a, @val_b, @val_c, @val_d);
end
commit tran
Auch bei kreativem Einsatz von IGNORE_DUP_KEY
, müssten Sie immer noch einen Insert/Update-Block oder eine Merge-Anweisung verwenden.
- Ein kreativer Einsatz von IGNORE_DUP_KEY – Paul White @Sql_Kiwi
update mytable
set col_d = 'val_d'
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c';
insert into mytable (col_a, col_b, col_c, col_d)
select 'val_a','val_b', 'val_c', 'val_d'
where not exists (select *
from mytable with (serializable)
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c'
);
Die Merge-Antwort von Spock sollte das tun, was Sie wollen.
Zusammenführen ist nicht unbedingt empfehlenswert. Ich benutze es, aber ich würde das niemals gegenüber @AaronBertrand zugeben.
-
Seien Sie vorsichtig mit der MERGE-Anweisung von SQL Server - Aaron Bertrand
-
Kann ich diese Merge-Anweisung optimieren - Aaron Bertrand
-
Wenn Sie indizierte Ansichten und MERGE verwenden, lesen Sie dies bitte! - Aaron Bertrand
-
Ein interessanter MERGE-Bug - Paul White
-
UPSERT Race Condition mit Merge