Улучшение sql кода с помощью динамического c имени столбца и значений - PullRequest
0 голосов
/ 28 апреля 2020

Я часами пытался обуздать динамику 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!

1 Ответ

0 голосов
/ 28 апреля 2020

Следующий код должен делать то, что вам нужно без динамического c SQL:

declare @ColumnName as VarChar(20) = 'dis';
declare @CurrentDate as Date = GetUTCDate();
declare @NewValue as SmallInt = 150;

-- Make sure there is a row for today.
if not exists ( select 42 from dbo.stat where Date = @CurrentDate )
  insert into dbo.stat ( test ) values ( 0 );

-- Update the appropriate column in today's row.
update dbo.stat
  set
    ti += case when @ColumnName = 'ti' then @NewValue else 0 end,
    cp += case when @ColumnName = 'cp' then @NewValue else 0 end,
    oos += case when @ColumnName = 'oos' then @NewValue else 0 end
  where Date = @CurrentDate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...