Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server einfügen, falls nicht vorhanden

statt unten Code

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

durch

ersetzen
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

Aktualisiert : (Danke an @Marc Durdin für den Hinweis)

Beachten Sie, dass dies unter hoher Last manchmal immer noch fehlschlägt, da eine zweite Verbindung den IF NOT EXISTS-Test bestehen kann, bevor die erste Verbindung den INSERT ausführt, dh eine Race-Bedingung. Unter stackoverflow.com/a/3791506/1836776 finden Sie eine gute Antwort darauf, warum selbst das Einschließen einer Transaktion das Problem nicht löst.