我有两个数组,第一个包含插入的列,第二个包含去值
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:"?"附近的语法不正确。
我可以毫无问题地选择数据库,但它似乎不喜欢语法。。
至少你忘了用圆括号包装?
:
const result = await pool.request().query(`INSERT INTO [Test].[TableName] (${testData.columns}) VALUES (?)`, [[testData.values2]]);
由于我找不到任何一个示例,即将sql查询的参数传递给query
函数或在其文档中使用?
作为占位符,我不确定节点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);