Ved første øjekast virker dit oprindelige forsøg ret tæt på. Jeg antager, at clockDate er et DateTime-felt, så prøv dette:
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
Bemærk, at getdate giver dig den aktuelle dato. Hvis du forsøger at sammenligne med en dato (uden klokkeslæt), skal du caste, ellers vil tidselementet få sammenligningen til at mislykkes.
Hvis clockDate IKKE er datetime-feltet (kun dato), så vil SQL-motoren gøre det for dig - ingen grund til at bruge en set/insert-sætning.
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
Som andre har påpeget, er fusionserklæringen en anden måde at tackle den samme logik på. Men i nogle tilfælde, især med store datasæt, kan flettesætningen være uoverkommelig langsom, hvilket forårsager en masse translog-aktivitet. Så at vide, hvordan man logiserer det som vist ovenfor, er stadig en gyldig teknik.