sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008 - SI NO EXISTE INSERTAR DE LO CONTRARIO ACTUALIZAR

A primera vista, su intento original parece bastante cercano. Supongo que clockDate es un campo DateTime, así que intente esto:

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 

Tenga en cuenta que getdate le da la fecha actual. Si está tratando de comparar con una fecha (sin la hora), debe emitir o el elemento de tiempo hará que la comparación falle.

Si clockDate NO es un campo de fecha y hora (solo fecha), entonces el motor SQL lo hará por usted, sin necesidad de convertir en una declaración de inserción/establecimiento.

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 han señalado otros, la instrucción merge es otra forma de abordar esta misma lógica. Sin embargo, en algunos casos, especialmente con grandes conjuntos de datos, la instrucción merge puede ser prohibitivamente lenta, lo que provoca una gran actividad de registro de transacciones. Entonces, saber cómo resolverlo lógicamente como se muestra arriba sigue siendo una técnica válida.