Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2008 - SE NÃO EXISTIR INSERIR OUTRA ATUALIZAÇÃO


À primeira vista, sua tentativa original parece bem próxima. Estou assumindo que clockDate é um campo DateTime, então tente isto:
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 

Observe que getdate fornece a data atual. Se você estiver tentando comparar com uma data (sem a hora), precisará converter ou o elemento time fará com que a comparação falhe.

Se clockDate NÃO for um campo de data e hora (apenas data), o mecanismo SQL fará isso por você - não há necessidade de converter em uma instrução 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 

Como outros apontaram, a instrução merge é outra maneira de lidar com essa mesma lógica. No entanto, em alguns casos, especialmente com grandes conjuntos de dados, a instrução de mesclagem pode ser proibitivamente lenta, causando muita atividade de log de transferência. Portanto, saber como raciocinar como mostrado acima ainda é uma técnica válida.