Как вставить в SQL с помощью библиотеки NodeJs и mssql с параметрами

У меня есть 2 массива, первый содержит столбцы для вставки, а второй содержит значения de

const columns = ['columnName1','columnName2','columnName3','columnName4','columnName5','columnName6'];

const values2 = ['test1', 'test2', 27, 1, 'an address', null];

module.exports = {columns, values2}

И я пытаюсь сделать вставку, используя библиотеку mmsql, но даже в документации нет образца с несколькими столбцами для вставки значений.

Это образец моей вставки

let pool = await sql.connect(config)
      

const result = await pool.request().query(`INSERT INTO [Test].[TableName] (${testData.columns}) VALUES ?`, [[testData.values2]]);
console.dir(result);

И я получаю следующую ошибку:

RequestError: Неправильный синтаксис рядом с '?'.

Я смог без проблем выбрать базу данных, но что-то в синтаксисе, похоже, ему не нравится.


person Vicko    schedule 25.09.2020    source источник
comment
не пользователь node mssql, но мне показалось, что вы должны смотреть на функцию .bulk   -  person Eric Wong    schedule 25.09.2020


Ответы (2)


По крайней мере, вы забыли заключить ? в круглые скобки:

const result = await pool.request().query(`INSERT INTO [Test].[TableName] (${testData.columns}) VALUES (?)`, [[testData.values2]]);

person Anatoly    schedule 25.09.2020
comment
Вы пытаетесь указать много столбцов, но только одно значение: массив значений. Вы должны указать столько ?, сколько у вас есть столбцов в INSERT - person Anatoly; 25.09.2020

Поскольку я не могу найти ни одного примера, где вы передаете параметры своего sql-запроса в функцию query или используете ? в качестве заполнителя в их документации, я не уверен, поддерживает ли это node-mssql. Но если это так, вы должны по крайней мере создать столько ? в операторе sql, сколько вы добавляете значений.

var cols = [...]; //your columns
const sqlquery = `insert into sometable (${cols}) values (${new Array(cols.length).fill('?')})`;

Документированный способ будет использовать входные параметры

await pool.request()
   .input('p1', sql.Int, value1)
   .input('p2', sql.VarChar(50), value2)
   .query('insert into sometable(col1, col2) values(@p1, @p2)');

Чтобы сохранить эту гибкость, вы можете использовать что-то вроде следующего

var cols = ['col1', 'col2'];
var vals = ['a string', 23];

const request = pool.request();
for (let i = 0; i < vals.length; i++)
  request.input(`param_${i}`, vals[i]);  //if you skip the parametertype, mssql will guess it from the value
const sqlquery = `insert into sometable(${cols}) values (${vals.map((_,i) => `@param_${i}`)`;

const result = await request.query(sqlquery);
person derpirscher    schedule 25.09.2020