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.