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

Controllo dei vincoli:TRY/CATCH vs Exists()

Ho visto quell'articolo, ma nota che per bassi tassi di errore preferirei il modello "JFDI". L'ho già usato su sistemi ad alto volume (40.000 righe/secondo).

Nel codice di Aaron, puoi comunque ottenere un duplicato quando esegui il test prima sotto carico elevato e molte scritture. (spiegato qui su dba.se ) Questo è importante:i tuoi duplicati accadono ancora, solo meno spesso. Hai ancora bisogno di gestire le eccezioni e sapere quando ignorare l'errore duplicato (2627)

Modifica:spiegato succintamente da Remus in un'altra risposta

Tuttavia, avrei un TRY/CATCH separato per testare solo per l'errore duplicato

BEGIN TRY

-- stuff

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

--more stuff

BEGIN CATCH
    RAISERROR etc
END CATCH