Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Inserendo una riga solo se non è già presente

Che dire del modello "JFDI"?

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Seriamente, questo è il più veloce e il più simultaneo senza blocchi, specialmente ad alti volumi. Cosa succede se UPDLOCK viene escalation e l'intera tabella è bloccata?

Leggi la lezione 4:

Lezione 4: Durante lo sviluppo dell'upsert proc prima di ottimizzare gli indici, mi sono innanzitutto fidato del fatto che If Exists(Select…) la linea verrebbe attivata per qualsiasi articolo e vieterebbe i duplicati. Nada. In breve tempo si sono verificati migliaia di duplicati perché lo stesso articolo avrebbe colpito l'upsert allo stesso millisecondo ed entrambe le transazioni avrebbero visto un non esiste ed avrebbero eseguito l'inserimento. Dopo molti test, la soluzione era utilizzare l'indice univoco, rilevare l'errore e riprovare consentendo alla transazione di vedere la riga ed eseguire un aggiornamento anziché un inserimento.