Как использовать параметры в SQL Server?

Новичок здесь! Я только начал работать с 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.

Большое спасибо за любой совет!

каков тип данных столбца weight в вашей таблице, кажется, это один из числовых типов, но ваше тело запроса имеет суффикс «kg», который выдает ошибку.

Anand Sowmithiran 20.01.2023 14:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

С помощью 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');

Большое спасибо за помощь!

Другие вопросы по теме