Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008 – WENN NICHT VORHANDEN, SONST AKTUALISIEREN EINFÜGEN

Auf den ersten Blick scheint Ihr ursprünglicher Versuch ziemlich nah dran zu sein. Ich gehe davon aus, dass clockDate ein DateTime-Feld ist, also versuchen Sie Folgendes:

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 

Beachten Sie, dass getdate Ihnen das aktuelle Datum liefert. Wenn Sie versuchen, mit einem Datum (ohne Uhrzeit) zu vergleichen, müssen Sie umwandeln, oder das Zeitelement führt dazu, dass der Vergleich fehlschlägt.

Wenn clockDate KEIN datetime-Feld ist (nur date), dann erledigt dies die SQL-Engine für Sie – Sie müssen keine set/insert-Anweisung umwandeln.

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 

Wie andere bereits betont haben, ist die Merge-Anweisung eine weitere Möglichkeit, dieselbe Logik anzugehen. In einigen Fällen, insbesondere bei großen Datensätzen, kann die Merge-Anweisung jedoch unerschwinglich langsam sein, was zu einer hohen Tran-Log-Aktivität führt. Zu wissen, wie man es wie oben gezeigt logisch auslöst, ist also immer noch eine gültige Technik.