sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2008 - HVIS IKKE FINDER INDSÆT ANDEN OPDATERING

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.



  1. Nulværdi er ikke unik

  2. MySQL DELETE FROM med underforespørgsel som betingelse

  3. Kontroller, at brugerens adgangskode er gyldig eller ej i plsql

  4. Henter rækker tilføjet sidste time