Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

May 15, 2008 / by Zsolt Soczó

SQL Server UPSERT variációk 2.

Folytatásként mutatok egy második nekifutást az előző rész problémájára. Ebben elkerültem a felesleges if exists-et, amely miatt egyszerűbb lett az eljárás. Azt vártam egyébként, hogy gyorsabb is lesz, de nem, hisz most is kétszer futunk neki a táblának.

create proc dbo.UpsertClient2
  @id int,
  @name nvarchar(100)
as
set xact_abort on
begin transaction

update dbo.Client with (serializable) set name = @name where id = @id

if (@@rowcount = 0)
  insert dbo.Client (id, name) values (@id, @name)

commit

Az előző megoldáshoz képest itt nem kellett updlock hint, hisz az update elve azt használ az olvasási fázisban (másként a sima update-ek is állandóan deadlockolnának, pont ezért van külön update lock).
A serializable az előző részben részletezett okok miatt kell, azaz meg kell fogni az update-elendő kulcsot, ha létezik a sor, ha nem, hogy a következő insertnek “meg legyen ágyazva a hely”.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.