sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008 - OM INTE FINNS SÄTT IN ANNAN UPPDATERING

Vid första anblicken verkar ditt ursprungliga försök ganska nära. Jag antar att clockDate är ett DateTime-fält så prova detta:

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 

Observera att getdate ger dig det aktuella datumet. Om du försöker jämföra med ett datum (utan tiden) måste du kasta, annars kommer tidselementet att göra att jämförelsen misslyckas.

Om clockDate INTE är datetime-fältet (bara datum), kommer SQL-motorn att göra det åt dig - du behöver inte använda en set/insert-sats.

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 

Som andra har påpekat är sammanslagningsförklaringen ett annat sätt att tackla samma logik. Men i vissa fall, särskilt med stora datamängder, kan sammanslagningssatsen vara oöverkomligt långsam, vilket orsakar mycket tranloggaktivitet. Så att veta hur man loggar ut det som visas ovan är fortfarande en giltig teknik.



  1. SQL Server 2016:Infoga data

  2. c# läser SQL-tabell (med specialtecken) i DataSet

  3. ExecuteReader kräver en öppen och tillgänglig anslutning. Anslutningens nuvarande tillstånd är Ansluter

  4. mysql namnkonvention