痛點分析
Access 透過 DAO/ADO 逐筆 INSERT 寫入 30 萬筆資料,耗時數分鐘甚至更久,主要瓶頸在:
- 每筆圍繞 Jet/ACE 引擎的交易開銷
- 索引即時維護、鎖定升級
- 網路/介面層往返延遲
核心方案:資料 → 文字檔 → MDB
利用 Access 內建文字檔匯入引擎,繞過逐筆寫入路徑,直達儲存層。
實作步驟
步驟 1:產生標準 CSV 文字檔
- 每行一筆記錄,第一行為標題列
- 欄位間用逗號分隔,符合
CommaText 規範(含引號、逗號、換行的欄位需雙引號包裹並跳脫)
- 編碼建議 ANSI 或 UTF-8(視 Access 版本)
步驟 2:SQL 批次匯入
SELECT * INTO tableName1
FROM [Text;DATABASE=路徑].[檔名.txt]
關鍵語法細節
| 元素 | 說明 |
[Text;DATABASE=路徑] | 外部資料來源描述,中括號必須保留 |
DATABASE=路徑 | 文字檔所在**目錄**(非檔案完整路徑) |
[檔名.txt] | 檔名含副檔名,方括號必須保留 |
SELECT * INTO 新表 | 自動建立目標表結構並匯入 |
實測效能數據
- 30 萬筆資料:約 10 秒 完成匯入
- 對比逐筆 DAO 寫入:提升 100~500 倍
必要前置條件
- 啟用 VBA 巨集安全性:
檔案 → 選項 → 信任中心 → 巨集設定 → 啟用所有巨集
- 或在程式碼中設定
Application.AutomationSecurity = msoAutomationSecurityLow
- 確保文字檔格式正確(可先用 Access 手動「外部資料 → 文字檔」導入驗證)
適用範圍與限制
| 適用 | 不適用 |
| 大批量初始化/同步匯入 | 頻繁小批次增量更新(改用 DAO/ADO) |
| 結構固定、欄位型別穩定 | 含 OLE 物件、附件、複雜計算欄位 |
| 離線/批次處理窗口 | 即時性要求極高的線上交易 |
擴展:VBA 完整自動化範例
Sub ImportBigData()
Dim txtPath As String, txtFile As String, tblName As String
txtPath = "C:\Data\"
txtFile = "bigdata.txt"
tblName = "TargetTable"
On Error Resume Next
DoCmd.DeleteObject acTable, tblName
On Error GoTo 0
Dim sql As String
sql = "SELECT * INTO [" & tblName & "] FROM [Text;DATABASE=" & txtPath & "].[" & txtFile & "]"
CurrentDb.Execute sql, dbFailOnError
MsgBox "匯入完成:" & CurrentDb.TableDefs(tblName).RecordCount & " 筆"
End Sub
文字檔中轉法是 Access 大量資料匯入的「殺手鐧」,善用內建引擎,事半功倍。
- 上一篇文章: Oracle 資料表匯出 INSERT 腳本:SQL*Plus SPOOL 實戰技巧
- 下一篇文章: PowerDesigner 教程(六):概念資料模型(CDM)關聯關係完整指南
Copyright ©
程式碼之家 All Rights Reserved