SQL Server批量插入数据遇三类问题,求技术解决方案
解决方案
1. 修复event_date字段的转换错误
你的日期字符串格式虽符合ISO标准,但SQL Server自动转换时容易出错,需明确指定参数类型为datetimeoffset,或先转为JavaScript的Date对象(确保时区匹配):
// 方式1:显式声明参数类型 request.input('event_date', sql.DateTimeOffset, postObj.event_date); // 方式2:转为Date对象(自动处理时区) const eventDate = new Date(postObj.event_date); request.input('event_date', sql.DateTimeOffset, eventDate);
2. 处理event_name的中文字符(N前缀问题)
SQL Server的nvarchar类型需要识别Unicode字符,使用mssql库时,只要显式指定参数类型为sql.NVarChar,库会自动添加N前缀,无需手动拼接:
request.input('event_name', sql.NVarChar(500), postObj.event_name);
如果不指定类型,库默认用VarChar会导致中文乱码,必须显式声明NVarChar。
3. 拆分嵌套坐标对象为表字段
需要将start_coordinates、end_coordinates的子属性映射到表中对应字段,同时一万条数据绝对不能循环单条插入,建议用mssql的Table对象做批量插入,效率提升数十倍:
完整批量插入代码
const sql = require('mssql'); async function bulkInsertEvents(postObjList) { try { await sql.connect(dbConfig); // 创建与数据库表结构匹配的临时表对象 const eventTable = new sql.Table('test'); // 逐一添加表字段及对应类型 eventTable.columns.add('event_name', sql.NVarChar(500), { nullable: false }); eventTable.columns.add('event_country', sql.NVarChar(500), { nullable: false }); eventTable.columns.add('event_date', sql.DateTimeOffset(7), { nullable: false }); eventTable.columns.add('start_coordinates_latitude', sql.VarChar(100), { nullable: true }); eventTable.columns.add('start_coordinates_longitude', sql.VarChar(100), { nullable: true }); eventTable.columns.add('end_coordinates_latitude', sql.VarChar(100), { nullable: true }); eventTable.columns.add('end_coordinates_longitude', sql.VarChar(100), { nullable: true }); // 遍历所有记录,填充临时表 postObjList.forEach(item => { eventTable.rows.add( item.event_name, item.event_country, new Date(item.event_date), item.start_coordinates?.latitude?.toString(), // 可选链避免空对象报错 item.start_coordinates?.longitude?.toString(), item.end_coordinates?.latitude?.toString(), item.end_coordinates?.longitude?.toString() ); }); // 执行批量插入 const request = new sql.Request(); await request.bulk(eventTable); console.log('批量插入完成'); } catch (err) { console.error('插入失败:', err); } finally { await sql.close(); } } // 调用方法,传入postObj数组 bulkInsertEvents(postObj);
关键注意点
- 批量插入是处理万级数据的最优方案,避免单条循环的性能损耗
- 用
sql.Table严格匹配数据库字段类型,彻底规避类型转换错误 - 可选链
?.处理可能存在的空坐标对象,防止程序崩溃 - 所有Unicode字段统一用
sql.NVarChar类型,保证中文正常存储
内容的提问来源于stack exchange,提问作者Jenny Hui
相关产品推荐
相关产品推荐

