从表格到数据库的完整路径
业务同事给的是 Excel 或 CSV,开发要在 SQL Server / MySQL 等库里落库。常见路线:
- 整理表格(表头、编码、去重)
- 用 Excel 转 SQL 生成
INSERT/UPDATE/DELETE - 在测试库执行脚本,核对行数与字段
- 分批导入生产库
本篇汇总导入过程中最容易踩坑的环节,配合 INSERT、UPDATE、DELETE 系列使用。
支持的文件格式
| 格式 | 支持 | 说明 |
|---|---|---|
.xlsx、.xlsm、.xltx、.xltm |
是 | 推荐,多 Sheet 可选 |
.csv |
是 | UTF-8,逗号分隔;工具自动识别 BOM |
.xls(Excel 97-2003) |
否 | 请在 Excel 中「另存为 .xlsx」 |
表头规则:第一行必须是列名,数据从第二行开始。无表头或合并单元格会导致列映射错乱。
CSV 编码与乱码
工具以 UTF-8 读取 CSV,并检测 BOM(字节顺序标记)。
| 现象 | 原因 | 处理 |
|---|---|---|
| 中文变乱码 | 文件实为 GBK/GB2312 | Excel 另存为「CSV UTF-8」或用 CSV 转 Excel 检查 |
| Excel 打开 CSV 列错位 | 字段含逗号未加引号 | 在 Excel 中整理后另存为 .xlsx 再上传 |
| 首列莫名多出字符 | UTF-8 BOM | 一般可正常解析;若异常,用无 BOM 的 UTF-8 重存 |
建议:对外交换数据统一 UTF-8;从 SQL 导出 CSV 时注意导出工具的编码选项。
列名与字段映射
- 列名尽量与数据库字段一致,减少改映射的时间。
- 工具会去掉列名中的空格;可在列矩阵里改为实际字段名(如
User Name→UserName)。 - 表名支持
dbo.TableName;#TempTable会附带 CREATE / INSERT 预览 / DROP,适合先灌临时表再INSERT INTO ... SELECT。
勾选列时只选需要进库的字段,忽略 Excel 里的备注列、序号列。
数据类型与 SQL 输出
| Excel / CSV 内容 | 生成 SQL 中的表现 |
|---|---|
| 文本 | 单引号包裹,' 转义为 '' |
| 日期 | 引号包裹,建议源数据用 yyyy-MM-dd 或 ISO 格式 |
| 整数 / 小数 | 不加引号 |
| 空单元格 | NULL |
| 布尔 / 是或否 | 按文本或数字处理,需与表结构一致 |
导入后若类型不匹配(如把 "N/A" 插入 int 列),需在 Excel 侧清洗,或导入临时表再用 SQL 转换。
语句类型怎么选
| 目标 | 语句类型 | 说明 |
|---|---|---|
| 新表灌数 | INSERT | 可开「批量 INSERT」,见 INSERT 指南 |
| 改已有记录 | UPDATE | 区分 SET 与 WHERE 列,见 UPDATE 指南 |
| 按 ID 删除 | DELETE | 必须指定 WHERE,见 DELETE 指南 |
| 先查 ID 是否存在 | Select | 生成 WHERE col IN (...) 便于核对 |
大数据量策略
- 单次生成上限 50,000 行;更大文件请拆 Sheet 或拆 CSV。
- 数千行以上优先 下载
.sql,避免在浏览器长时间预览。 - 在 SSMS / 客户端中 分批执行,每批 500~1000 行,观察锁与日志。
- 导入前可暂时 禁用非聚集索引,导入后重建,加快 bulk 插入。
- 执行后用
@@ROWCOUNT或SELECT COUNT(*)核对。
开启 批量 INSERT 时,工具约每 500 行合并为一条 INSERT ... VALUES (...), (...),减少网络往返。
导入前数据清洗建议
- 去重:避免主键冲突(尤其邮箱、订单号列表)。
- 合并:多文件汇总后统一导入。
- 格式化:统一日期显示与表头样式,减少肉眼误判。
- 网页复制的表:先 HTML 转 Excel,再转 SQL,避免列错位。
多数据库方言
Excel 转 SQL 支持 SQL Server、MySQL、PostgreSQL、SQLite、Oracle。切换数据库类型后,标识符引号、部分语法会随方言调整。跨库迁移时先在目标库类型下生成脚本,不要直接复用另一种库的 SQL。
隐私与文件处理
Excel / CSV 上传后在服务端 解析并生成 SQL,处理完成后删除文件,不会长期存储。仍建议:
- 生产敏感数据脱敏后再上传
- 优先在测试环境使用
- 大批量含个人信息时考虑内网部署或本地工具链
推荐执行流程(Checklist)
[ ] CSV 已 UTF-8,表头正确
[ ] 已在测试库试跑 INSERT/UPDATE/DELETE
[ ] 行数与 Excel 一致
[ ] 字符串、日期、NULL 符合表结构
[ ] 生产库已备份
[ ] 分批执行脚本
[ ] 导入后业务抽样验证