sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 - INDIEN NIET BESTAAT INSERT ANDERS UPDATE

Op het eerste gezicht lijkt je oorspronkelijke poging redelijk dichtbij. Ik neem aan dat clockDate een DateTime-veld is, dus probeer dit:

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 

Merk op dat getdate je de huidige datum geeft. Als je probeert te vergelijken met een datum (zonder de tijd), moet je casten, anders mislukt het vergelijken door het tijdselement.

Als clockDate GEEN datetime-veld is (alleen datum), dan zal de SQL-engine het voor u doen - u hoeft geen set/insert-statement in te voeren.

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 

Zoals anderen al hebben opgemerkt, is de merge-instructie een andere manier om dezelfde logica aan te pakken. In sommige gevallen, vooral bij grote datasets, kan de merge-instructie echter onbetaalbaar traag zijn, wat veel trans-log-activiteit veroorzaakt. Dus weten hoe je het moet uittekenen, zoals hierboven getoond, is nog steeds een geldige techniek.



  1. Kan ik met MySql een kolom sorteren, maar 0 als laatste laten komen?

  2. De beste manier om een ​​gewogen zoekopdracht uit te voeren over meerdere velden in mysql?

  3. SQLAlchemy Core bulk invoegen traag

  4. Een overzicht van streamingreplicatie voor TimescaleDB