Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 - SI NON EXISTE INSÉRER AUTREMENT MISE À JOUR

À première vue, votre tentative initiale semble assez proche. Je suppose que clockDate est un champ DateTime, alors essayez ceci :

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 

Notez que getdate vous donne la date actuelle. Si vous essayez de comparer à une date (sans l'heure), vous devez lancer ou l'élément de temps entraînera l'échec de la comparaison.

Si clockDate n'est PAS un champ datetime (juste la date), alors le moteur SQL le fera pour vous - pas besoin de caster une instruction 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 

Comme d'autres l'ont souligné, l'instruction de fusion est une autre façon d'aborder cette même logique. Cependant, dans certains cas, en particulier avec des ensembles de données volumineux, l'instruction de fusion peut être extrêmement lente, ce qui entraîne une activité importante dans le journal des transactions. Donc, savoir comment le logiquer comme indiqué ci-dessus est toujours une technique valable.