Transaktionen nicht vergessen. Die Leistung ist gut, aber ein einfacher (IF EXISTS..) Ansatz ist sehr gefährlich.
Wenn mehrere Threads versuchen, Einfügen oder Aktualisieren durchzuführen, kann es leicht zu einer Verletzung des Primärschlüssels kommen.
Von @Beau Crawford und @Esteban bereitgestellte Lösungen zeigen eine allgemeine Idee, sind aber fehleranfällig.
Um Deadlocks und PK-Verletzungen zu vermeiden, können Sie so etwas verwenden:
begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
update table set ...
where key = @key
end
else
begin
insert into table (key, ...)
values (@key, ...)
end
commit tran
oder
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran