sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server Insertar si no existe

en lugar del siguiente Código

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

reemplazar 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

Actualizado: (gracias a @Marc Durdin por señalar)

Tenga en cuenta que bajo una carga alta, esto todavía fallará a veces, porque una segunda conexión puede pasar la prueba IF NOT EXISTS antes de que la primera conexión ejecute INSERT, es decir, una condición de carrera. Consulte stackoverflow.com/a/3791506/1836776 para obtener una buena respuesta sobre por qué incluso envolver una transacción no resuelve esto.