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

SQL Server 2008 — JEŚLI NIE ISTNIEJE, WSTAW AKTUALIZACJĘ W INNYM PRZYPADKU

Na pierwszy rzut oka twoja pierwotna próba wydaje się całkiem bliska. Zakładam, że clockDate to pola DateTime, więc spróbuj tego:

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 

Zauważ, że getdate podaje aktualną datę. Jeśli próbujesz porównać z datą (bez czasu), musisz rzucić lub element czasu spowoduje niepowodzenie porównania.

Jeśli clockDate NIE jest polem datetime (tylko data), to silnik SQL zrobi to za Ciebie - nie ma potrzeby rzutowania na instrukcję 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 

Jak zauważyli inni, oświadczenie scalające jest kolejnym sposobem rozwiązania tej samej logiki. Jednak w niektórych przypadkach, szczególnie w przypadku dużych zestawów danych, instrukcja merge może być zbyt powolna, powodując dużą aktywność dziennika transakcji. Tak więc wiedza o tym, jak to wylogować, jak pokazano powyżej, jest nadal poprawną techniką.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usługi niewidoczne w programie SQL Server Configuration Manager

  2. Alternatywa dla operatora MAX na polach bitowych

  3. Typy danych VARCHAR i NVARCHAR w SQL Server

  4. jTDS nieprawidłowo raportuje informacje o typie danych w metadanych zbioru wyników (dla kolumn DATE, raportuje NVARCHAR)

  5. Błędne milisekundy podczas konwersji z formatu XML na datę i godzinę w programie SQL Server