sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008 – POKUD NEEXISTUJE, INSERT ELSE UPDATE

Na první pohled se váš původní pokus zdá docela blízko. Předpokládám, že clockDate je pole DateTime, takže zkuste toto:

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 

Všimněte si, že getdate vám dává aktuální datum. Pokud se pokoušíte porovnat s datem (bez času), musíte přetypovat, nebo prvek času způsobí, že porovnání selže.

Pokud clockDate NENÍ pole datetime (pouze datum), pak to SQL engine udělá za vás – není třeba předávat příkaz 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 

Jak již poukázali jiní, příkaz merge je dalším způsobem, jak se vypořádat se stejnou logikou. V některých případech, zejména u velkých datových sad, však může být příkaz merge neúnosně pomalý, což způsobuje mnoho aktivity trans logu. Takže vědět, jak to vyložit, jak je uvedeno výše, je stále platná technika.



  1. potíže bind_param

  2. Jak vytvořit rekurzivní vlastní připojení v MySQL

  3. Jak aktualizovat kontingenční tabulku pomocí Eloquent v laravel 5

  4. Jak může LEFT OUTER JOIN vrátit více záznamů, než existuje v levé tabulce?