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

SQL Server 2008 - SE NON ESISTE INSERIRE ALTRO AGGIORNAMENTO

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.