Я часами пытался обуздать динамику c sql и не мог ничего сделать. Я наконец-то получил этот код, который работает, но должен быть лучший, более sql способ его написания.
DECLARE @ColumnName varchar(20), @Date date,@newValue smallint,@res varchar(20);
SET @ColumnName = 'dis';
SET @Date = Convert(varchar(10), GETUTCDATE(),120) ;
SET @newValue = 150;
SET @res=0;
If Not Exists (SELECT * FROM dbo.stat WHERE date= Convert(varchar(10), GETUTCDATE(),120) )
BEGIN
INSERT INTO dbo.stat (test) values (0)
END
IF EXISTS (SELECT MAX(ID) FROM dbo.stat ) AND EXISTS (SELECT * FROM dbo.stat WHERE date= Convert(varchar(10), GETUTCDATE(),120) )
BEGIN
UPDATE stat SET ti =
CASE
WHEN @ColumnName ='ti' AND ID = ( SELECT MAX(ID) FROM dbo.stat ) THEN ti + @newValue
ELSE ti
END,
cp = CASE
WHEN @ColumnName= 'cp' AND ID = ( SELECT MAX(ID) FROM dbo.stat )THEN cp +@newValue
ELSE cp
END,
oos = CASE
WHEN @ColumnName= 'oos' AND ID = ( SELECT MAX(ID) FROM dbo.stat )THEN oos +@newValue
ELSE oos
END;
END;
В основном он получает имя столбца (@ColumnName) и значение (@ новое_значение). Если строка с сегодняшней датой не завершается, она создает ее и обновляет значение по имени столбца, указанному в @ColumnName. Если он существует, он только обновляет значение. Это в конечном итоге станет хранимой процедурой.
Cheers!