Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server Inserir se não existir


em vez de abaixo do 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

substituir com
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

Atualizado: (obrigado a @Marc Durdin por apontar)

Observe que, sob carga alta, isso às vezes ainda falhará, porque uma segunda conexão pode passar no teste IF NOT EXISTS antes que a primeira conexão execute o INSERT, ou seja, uma condição de corrida. Consulte stackoverflow.com/a/3791506/1836776 para obter uma boa resposta sobre por que mesmo envolver uma transação não resolve isso.