Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server Insérer s'il n'existe pas

au lieu de ci-dessous 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

remplacer par

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

Mise à jour : (merci à @Marc Durdin pour le pointage)

Notez que sous une charge élevée, cela échouera encore parfois, car une deuxième connexion peut réussir le test IF NOT EXISTS avant que la première connexion n'exécute l'INSERT, c'est-à-dire une condition de concurrence. Voir stackoverflow.com/a/3791506/1836776 pour une bonne réponse sur pourquoi même l'encapsulation dans une transaction ne résout pas ce problème.