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

SQL Server Inserisci se non esiste

invece di sotto Codice

BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END

sostituire con

BEGIN
   IF NOT EXISTS (SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA)
   BEGIN
       INSERT INTO EmailsRecebidos (De, Assunto, Data)
       VALUES (@_DE, @_ASSUNTO, @_DATA)
   END
END

Aggiornato : (grazie a @Marc Durdin per la segnalazione)

Si noti che sotto carico elevato, questo a volte fallirà ancora, perché una seconda connessione può superare il test IF NOT EXISTS prima che la prima connessione esegua INSERT, ovvero una condizione di competizione. Vedi stackoverflow.com/a/3791506/1836776 per una buona risposta sul perché anche il wrapping in una transazione non risolve questo problema.