Просмотр полной версии : Перезапись значений в таблице MSSQL через хранимую процедуру.
Добрый день. Не получается реализовать перезапись значений переменных в таблицу 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
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 Время меняется, данные нет
У меня получилось записывать в базу как в примере от 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, а не наименование столбца.
Я ничего не понимаю в 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
щас попробуем...
Он параметром передает имя столбца, но похоже это не так делается.
Это я понимаю, что параметром. Я в MS SQL и TSQL ничего не понимаю, но в Oracle, например, такой (в таком виде) финт ушами точно не прокатит.
Вот тут что-то есть
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
Вот так попробуйте...
83392 ДА всё заработало! Очень благодарен.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot