Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chèn SQL Server nếu không tồn tại

thay vì bên dưới Mã

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

thay thế bằng

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

Đã cập nhật: (cảm ơn @Marc Durdin đã chỉ)

Lưu ý rằng trong điều kiện tải cao, điều này đôi khi vẫn không thành công, vì kết nối thứ hai có thể vượt qua kiểm tra IF NOT EXISTS trước khi kết nối đầu tiên thực hiện INSERT, tức là điều kiện chạy đua. Xem stackoverflow.com/a/3791506/1836776 để có câu trả lời tốt về lý do tại sao ngay cả khi gói trong một giao dịch cũng không giải quyết được điều này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kiểm tra phiên bản máy chủ SQL của bạn

  2. Chạy SQL Server 2014 trên máy ảo Azure

  3. Tham số Sniffing (hoặc Spoofing) trong SQL Server

  4. Thiết lập và cấu hình SQL Server Replication

  5. T-SQL Bỏ qua Thủ tục Đã Lưu trữ