sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server Indsæt, hvis den ikke findes

i stedet for under kode

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

erstatte med

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

Opdateret: (tak til @Marc Durdin for at pege)

Bemærk, at under høj belastning vil dette stadig nogle gange mislykkes, fordi en anden forbindelse kan bestå testen HVIS IKKE FINNES, før den første forbindelse udfører INSERT, dvs. en race-tilstand. Se stackoverflow.com/a/3791506/1836776 for et godt svar på, hvorfor selv indpakning i en transaktion ikke løser dette.



  1. org.postgresql.util.PSQLEundtagelse:Kolonneindekset er uden for interval:3, antal kolonner:2

  2. Varighed af data i en global midlertidig tabel?

  3. Sådan opretter du et forhold i MySQL Workbench

  4. Beregning og pladsbesparelse i PostgreSQL