Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wstaw SQL Server, jeśli nie istnieje

zamiast poniższego kodu

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

zamień na

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

Aktualizacja: (dzięki @Marc Durdin za wskazanie)

Zwróć uwagę, że przy dużym obciążeniu, to nadal czasami kończy się niepowodzeniem, ponieważ drugie połączenie może przejść test IF NOT EXISTS, zanim pierwsze połączenie wykona INSERT, tj. stan wyścigu. Odwiedź stackoverflow.com/a/3791506/1836776, aby uzyskać dobrą odpowiedź na pytanie, dlaczego nawet zawijanie w transakcję nie rozwiązuje tego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolejność warunkowa T-SQL według

  2. Uzyskaj identyfikator obiektu z jego nazwy w SQL Server:OBJECT_ID()

  3. Zmień przesunięcie strefy czasowej w wartości przesunięcia daty i godziny w programie SQL Server (T-SQL)

  4. Policz liczbę rekordów zwróconych przez grupę przez

  5. SQL Server 2016:tworzenie procedury składowanej