Nodejs mssql bulk insert报错Invalid object name问题求助
问题排查&解决步骤
- 确认连接配置的默认数据库
检查你代码中config、configLocal连接配置里有没有填写database字段,且值为存储my_test表的数据库名。如果未配置该字段,连接会默认指向master系统库,自然找不到业务库中的表。
- 确认连接配置的默认数据库
- 正确指定表所属的schema
不要把schema名直接拼接在new sql.Table()的表名字符串中,这种写法会被驱动识别为完整表名,导致匹配失败。正确写法是单独设置Table实例的schema属性:
- 正确指定表所属的schema
const table = new sql.Table('my_test'); table.create = false; table.schema = '你的实际schema名'; // 比如非默认dbo schema就填对应的schema名
如果需要跨库操作,还可以额外设置database属性:
table.database = '你的业务库名';
- 确认表名拼写&排序规则
如果你的SQL Server实例使用大小写敏感的排序规则,需要严格匹配表名的大小写,my_test和My_Test会被识别为两个不同的表。
- 确认表名拼写&排序规则
- 检查账号权限
确认连接使用的数据库账号拥有my_test表的INSERT权限,权限不足时SQL Server可能会返回Invalid Object Name错误避免泄露表存在的信息。
- 检查账号权限
补充注意事项
你的代码中id列设置了identity:true自增属性,但又手动给id列传值,需要在批量插入前开启IDENTITY_INSERT配置,否则解决表名问题后会触发新的报错,调整后的代码示例:
async function getPool(name) { if (!Object.prototype.hasOwnProperty.call(pools, name)) { const pool = process.env.NODE_ENV.trim() === 'local' ? new sql.ConnectionPool(configLocal) : new sql.ConnectionPool(config); const close = pool.close.bind(pool); pool.close = (...args) => { delete pools[name] return close(...args) } await pool.connect(); pools[name] = pool; } return pools[name]; } const pool = await getPool('default'); const table = new sql.Table('my_test'); // 补充schema和database配置 table.schema = 'dbo'; // 替换为实际schema // table.database = '你的库名'; // 跨库时启用 table.create = false; table.columns.add('id', sql.Int, { nullable: false,primary:true,identity:true}); table.columns.add('name', sql.VarChar(50), { nullable: false }); table.rows.add(10, 'test'); table.rows.add(11, 'test 2'); const request = new sql.Request(pool); // 开启自增列插入权限 const fullTableName = `${table.database ? `${table.database}.` : ''}${table.schema ? `${table.schema}.` : ''}${table.name}`; await request.query(`SET IDENTITY_INSERT ${fullTableName} ON`); request.bulk(table, (err, result) => { // 操作完成后关闭自增列插入权限 request.query(`SET IDENTITY_INSERT ${fullTableName} OFF`); console.log("Result ", result, err); });
内容的提问来源于stack exchange,提问作者Abhishek Kashyap
相关产品推荐
相关产品推荐

