PDA

Просмотр полной версии : Перезапись значений в таблице MSSQL через хранимую процедуру.



Enigma
24.04.2025, 07:17
Добрый день. Не получается реализовать перезапись значений переменных в таблицу MSSQL. Есть таблица в одну строку и 27 столбцов. Первый столбец dat-время обновления значений, все остальные это название переменных.
83382
и хранимая процедура
83383 при вызове процедуры перезаписывается только столбец dat. Ошибка как мне кажется в представлении имени столбца виде переменной @it_name.
Сама программа в MS4D:

pCommand:=EXEC [dbo].[UpdateDeaerator] @it_name = {it_name}, @value = {value}

FOR i :=0 TO count-1 DO
i:= i +1;
SqlRequest_2(Command:=pCommand , Transaction:=pTransaction
, it_name:=deaerator_old[i].it_name , value:=deaerator_old[i].value, Error => pError );
END_FOR

МихаилГл
24.04.2025, 07:47
А @it_name точно не '' всегда... Если убрать присваивание?83384

Enigma
24.04.2025, 08:50
83385 ни чего не поменялось. dat перезаписывается, переменные нет.

МихаилГл
24.04.2025, 09:24
... ни чего не поменялось. dat перезаписывается, переменные нет.
А параметры точно предаются таким запросом? Я в ms4d не шарю.
Кстати, скиньте таблицу из конструктора, что у вас там за переменные, может не флоат... И я честно не знаю, какой тип имеют наименования столбцов, может тут еще проблема. Или чистым sql запросом такая конструкция через declare работает?

МихаилГл
24.04.2025, 09:38
Имя столбца не обрабатывает


use aq1
declare
@it_name varchar(255),
@value float

SET @it_name = 'FE5'
SET @value = 0
begin
update [aq1].[dbo].[deaerator_web1] set dat = CURRENT_TIMESTAMP, @it_name = @value
end


Хотя проходит без ошибок...

PS Время меняется, данные нет

Enigma
24.04.2025, 09:43
У меня получилось записывать в базу как в примере от MS4D https://www.masterscada.ru/faq/primer-vzaimodeistviya-s-subd
8338683387

МихаилГл
24.04.2025, 09:48
У меня получилось записывать в базу как в примере от MS4D https://www.masterscada.ru/faq/primer-vzaimodeistviya-s-subd
8338683387

Тут @it_name это переменная в столбце kks, а не наименование столбца.

imaex
24.04.2025, 09:54
Я ничего не понимаю в TSQL, но, как, Вы просто присваиваете значение одной локальной переменной процедуры значение другой локальной переменной той же процедуры

update [aq1].[dbo].[deaerator_web1] set dat = CURRENT_TIMESTAMP, @it_name = @value

НЯП, на выходе в @it_name запишется преобразованное в varchar2 значение @value.

Почему для dat Вы указываете просто имя столбца, а для FE5 вместо имени @it_name.
Что-то у Вас с синтаксисом не так. ПМСМ.

МихаилГл
24.04.2025, 09:58
Он параметром передает имя столбца, но похоже это не так делается.

Вот тут что-то есть
https://ru.stackoverflow.com/questions/1057105/%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C-%D0%B8%D0%BC%D1%8F-%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D 1%83%D1%8E-ms-sql
щас попробуем...

imaex
24.04.2025, 10:15
Он параметром передает имя столбца, но похоже это не так делается.


Это я понимаю, что параметром. Я в MS SQL и TSQL ничего не понимаю, но в Oracle, например, такой (в таком виде) финт ушами точно не прокатит.

imaex
24.04.2025, 10:17
Вот тут что-то есть
https://ru.stackoverflow.com/questions/1057105/%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C-%D0%B8%D0%BC%D1%8F-%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D 1%83%D1%8E-ms-sql
щас попробуем...

Ну, похоже, что точно так же, как и в Oracle - через динамический SQL.

МихаилГл
24.04.2025, 10:44
Ну, похоже, что точно так же, как и в Oracle - через динамический SQL.

use aq1
declare
@str nvarchar(max),
@it_name nvarchar(max),
@value float

Set @it_name = 'FE5'
Set @value = 192

Set @str = 'update [aq1].[dbo].[deaerator_web1] set dat = CURRENT_TIMESTAMP, ' +@it_name+ ' = '+CONVERT(nvarchar(max), @value)+''

exec(@str)


Весь моск сломал... Теперь работает!

МихаилГл
24.04.2025, 11:06
83385 ни чего не поменялось. dat перезаписывается, переменные нет.

83389
Вот так попробуйте...

Enigma
24.04.2025, 13:28
83392 ДА всё заработало! Очень благодарен.