A prima vista il tuo tentativo originale sembra abbastanza vicino. Presumo che clockDate sia un campo DateTime, quindi prova questo:
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
Nota che getdate ti dà la data corrente. Se stai cercando di eseguire il confronto con una data (senza l'ora), devi eseguire il cast o l'elemento ora farà fallire il confronto.
Se clockDate NON è il campo datetime (solo data), il motore SQL lo farà per te, non è necessario eseguire il cast su un'istruzione 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
Come altri hanno sottolineato, la dichiarazione di fusione è un altro modo per affrontare questa stessa logica. Tuttavia, in alcuni casi, specialmente con set di dati di grandi dimensioni, l'istruzione di unione può essere proibitivamente lenta, causando molte attività di trans log. Quindi sapere come risolverlo come mostrato sopra è ancora una tecnica valida.