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

SQL Server 2008 - NẾU KHÔNG TỒN TẠI CHÈN CẬP NHẬT ELSE

Thoạt nhìn, nỗ lực ban đầu của bạn có vẻ khá gần. Tôi giả sử rằng clockDate là một trường DateTime, vì vậy hãy thử điều này:

IF (NOT EXISTS(SELECT * FROM Clock WHERE cast(clockDate as date) = '08/10/2012') 
    AND userName = 'test') 
BEGIN 
    INSERT INTO Clock(clockDate, userName, breakOut) 
    VALUES(GetDate(), 'test', GetDate()) 
END 
ELSE 
BEGIN 
    UPDATE Clock 
    SET breakOut = GetDate()
    WHERE Cast(clockDate AS Date) = '08/10/2012' AND userName = 'test'
END 

Lưu ý rằng getdate cung cấp cho bạn ngày hiện tại. Nếu bạn đang cố gắng so sánh với một ngày (không có thời gian), bạn cần truyền hoặc yếu tố thời gian sẽ khiến so sánh không thành công.

Nếu clockDate KHÔNG phải là trường datetime (chỉ ngày), thì công cụ SQL sẽ làm việc đó cho bạn - không cần truyền trên câu lệnh set / insert.

IF (NOT EXISTS(SELECT * FROM Clock WHERE clockDate = '08/10/2012') 
    AND userName = 'test') 
BEGIN 
    INSERT INTO Clock(clockDate, userName, breakOut) 
    VALUES(GetDate(), 'test', GetDate()) 
END 
ELSE 
BEGIN 
    UPDATE Clock 
    SET breakOut = GetDate()
    WHERE clockDate = '08/10/2012' AND userName = 'test'
END 

Như những người khác đã chỉ ra, câu lệnh hợp nhất là một cách khác để giải quyết logic tương tự. Tuy nhiên, trong một số trường hợp, đặc biệt là với các tập dữ liệu lớn, câu lệnh hợp nhất có thể rất chậm, gây ra nhiều hoạt động ghi nhật ký. Vì vậy, biết cách logic nó ra như được hiển thị ở trên vẫn là một kỹ thuật hợp lệ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khóa lạc quan so với bi quan

  2. Cách xử lý nhiều đối tượng bằng cách sử dụng Object Explorer Chi tiết Windows trong SSMS - Hướng dẫn sử dụng SQL Server / TSQL Phần 22

  3. Xóa các bản sao khỏi tập dữ liệu lớn (> 100Mio hàng)

  4. Tại sao sử dụng kiểu dữ liệu địa lý SQL Server 2008?

  5. Tại sao tôi không thể truy vấn truy vấn OFFSET / FETCH trên SQL Server của mình?