sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Vložit, pokud neexistuje

namísto níže uvedeného kódu

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

nahradit

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

Aktualizováno: (děkujeme @Marc Durdin za upozornění)

Všimněte si, že při vysoké zátěži to stále někdy selže, protože druhé připojení může projít testem IF NOT EXISTS dříve, než první připojení provede INSERT, tj. spor. Na stránce stackoverflow.com/a/3791506/1836776 najdete dobrou odpověď na otázku, proč to nevyřeší ani zabalení transakce.



  1. Vyhledejte, zda je číslo obsaženo ve výrazu jako:1-3,5,10-15,20

  2. Jak mohu provést požadavek HTTP ze serveru SQL?

  3. Jak mohu vybrat posledních 5 řádků v tabulce bez řazení?

  4. Brent Ozar vysvětluje interní a externí fragmentaci SQL Serveru