Новичок здесь! Я только начал работать с SQL Server в функциях Azure (в Typescript). Я пытаюсь обновить строку в базе данных, используя объявленные переменные, но мне не удается сделать это с типами VARCHAR
. Интересно, что в инструменте базы данных он работает нормально, но как только я пытаюсь выполнить запрос внутри функции Azure, я получаю ошибку http me 500.
RequestError: Неправильный синтаксис рядом с «kg»
(работа с весом как со струной).
На данный момент мой код выглядит так:
const trainingId: number = parseInt(req.params.training_id);
const exerciseId: number = parseInt(req.params.exercise_id);
const weight: string = req.body.weight;
await mssql.query(
`DECLARE @sql NVARCHAR(4000);
DECLARE @training_id INT;
DECLARE @exercise_id INT;
DECLARE @weight VARCHAR(255);
set @sql = N'
UPDATE Exercises SET weight = @weight WHERE training_id = @training_id AND exercise_id = @exercise_id'
SET @training_id = ${trainingId};
SET @exercise_id = ${exerciseId};
SET @weight = ${weight};
exec sp_executesql @sql, N'@training_id INT, @exercise_id INT, @weight VARCHAR(255)',
@training_id, @exercise_id, @weight`
Я также пробовал синтаксис, когда я вставляю переменную веса в запрос следующим образом:
SET weight ' + @weight + '
и тоже не работал.
Я также пытался использовать этот подход здесь: Как передать параметр в запрос mssql в узле js Но это не сработало и для меня. Итак, как я могу правильно передать параметры? Я пытаюсь избежать инъекции SQL.
Большое спасибо за любой совет!
С помощью SET @weight = ${weight};
вы вводите значения в запрос, который вы используете для выполнения другого запроса. Почему бы не использовать этот запрос UPDATE сразу после того, как вы используете mssql.input(...)
для установки значений параметров (согласно вашей ссылке )?
Насколько я понимаю, должно быть что-то вроде:
const trainingId: number = parseInt(req.params.training_id);
const exerciseId: number = parseInt(req.params.exercise_id);
const weight: string = req.body.weight;
// set up parameters
mssql.input('training_id', Sql.Int, trainingId);
mssql.input('exercise_id', Sql.Int, exerciseId);
mssql.input('weight ', Sql.VarChar, weight);
// execute just the UPDATE query, using the parameters
await mssql.query('UPDATE Exercises SET weight = @weight WHERE training_id = @training_id AND exercise_id = @exercise_id');
Идеальный! Я все время делал это неправильно, так как не связывал новый запрос с mssql. Что работает для меня сейчас:
const request: mssql.Request = new mssql.Request();
request.input('training_id', mssql.Int, trainingId);
request.input('exercise_id', mssql.Int, exerciseId);
request.input('weight ', mssql.VarChar, weight);
const result = await request.query('UPDATE Exercises SET weight = @weight WHERE training_id = @training_id AND exercise_id = @exercise_id');
Большое спасибо за помощь!
каков тип данных столбца
weight
в вашей таблице, кажется, это один из числовых типов, но ваше тело запроса имеет суффикс «kg», который выдает ошибку.