You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:32:45