業務場景
- 目標表 A (SQL Server) 已有結構與資料
- Excel B:ID 對照 Name 映射表
- Excel C (N 張):同結構明細,無 ID 欄
- 任務:用 B 為 C 補齊 ID → 依 ID 更新 A
方案一:MySQL for Excel 外掛 (嘗試失敗)
- Excel 內直接連 MySQL/SQL Server,像編輯表格一樣操作資料庫
- 支援表合併、資料同步
- 實測痛點:本地連線正常,遠端伺服器連線頻繁失敗 (防火牆、權限、驅動版本)
- 結論:不適合生產環境跨網段操作
方案二:Excel 先導入資料庫,再用 SQL 處理 (推薦)
關鍵前置處理
- 手機號/長數字欄位 → 設為「文字」格式,防止科學記號/截斷
- 統一繁體/簡體,避免編碼不匹配
- 清理空格、不可見字元:
TRIM()、CLEAN()
導入步驟
- SSMS → 目標資料庫右鍵 → 工作 → 匯入資料
- 資料來源:Microsoft Excel (或 ACE OLEDB)
- 目的地:SQL Server Native Client
- 將 B、C 表分別導入暫存表
#Map、#Detail
核心 SQL 處理邏輯
-- 1. 為明細補齊 ID
UPDATE d
SET d.ID = m.ID
FROM #Detail d
JOIN #Map m ON m.Name = d.Name; -- 假設 Name 唯一
-- 2. 依 ID 更新目標表 A
UPDATE A
SET A.Col1 = d.Col1, A.Col2 = d.Col2, ...
FROM A
JOIN #Detail d ON A.ID = d.ID;
大資料量優化
- 暫存表加索引:
CREATE INDEX idx_name ON #Detail(Name)
- 分批更新:
TOP (5000) 循環,避免長鎖、Log 爆漲
- 最小日誌:
BULK INSERT 或 SqlBulkCopy 導入暫存表
方案對比總結
| 維度 | MySQL for Excel | SQL 腳本直導 |
| 遠端穩定性 | ❌ 差 | ✅ 佳 |
| 可重複/自動化 | ❌ 手工 | ✅ 腳本化/排程 |
| 資料清洗能力 | ⚠️ 弱 | ✅ SQL 全功能 |
| 效能 | ⚠️ 受限 Excel | ✅ 批量/並行 |
| 推薦指數 | ⭐⭐ | ⭐⭐⭐⭐⭐ |