Op het eerste gezicht lijkt je oorspronkelijke poging redelijk dichtbij. Ik neem aan dat clockDate een DateTime-veld is, dus probeer dit:
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
Merk op dat getdate je de huidige datum geeft. Als je probeert te vergelijken met een datum (zonder de tijd), moet je casten, anders mislukt het vergelijken door het tijdselement.
Als clockDate GEEN datetime-veld is (alleen datum), dan zal de SQL-engine het voor u doen - u hoeft geen set/insert-statement in te voeren.
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
Zoals anderen al hebben opgemerkt, is de merge-instructie een andere manier om dezelfde logica aan te pakken. In sommige gevallen, vooral bij grote datasets, kan de merge-instructie echter onbetaalbaar traag zijn, wat veel trans-log-activiteit veroorzaakt. Dus weten hoe je het moet uittekenen, zoals hierboven getoond, is nog steeds een geldige techniek.