sql >> Database >  >> RDS >> Sqlserver

Oplossingen voor INSERT OF UPDATE op SQL Server

vergeet transacties niet. Prestaties zijn goed, maar een eenvoudige (INDIEN BESTAAN..) benadering is erg gevaarlijk.
Als meerdere threads zullen proberen om Insert-of-update uit te voeren, kunt u gemakkelijk een schending van de primaire sleutel krijgen.

Oplossingen van @Beau Crawford &@Esteban tonen een algemeen idee, maar zijn foutgevoelig.

Om impasses en PK-overtredingen te voorkomen, kunt u zoiets als dit gebruiken:

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

of

begin tran
   update table with (serializable) set ...
   where key = @key

   if @@rowcount = 0
   begin
      insert into table (key, ...) values (@key,..)
   end
commit tran


  1. Alleen PostgreSQL in het geheugen uitvoeren

  2. SQL waarbij de samengevoegde set alle waarden moet bevatten, maar mag meer bevatten

  3. Voorbeelden van het converteren van 'date' naar 'datetime' in SQL Server (T-SQL)

  4. Hoe kan ik in mijn geval SQL in Oracle schrijven?