將 Excel 試算表資料導入 SQL Server 是資料遷移、ETL 與日常維運的常見需求。依據資料量、頻率與環境限制,可選擇圖形化工具、T-SQL 指令、程式碼或 ETL 套件等不同方式。本文系統整理六大主流方法,並說明適用情境與注意事項。
nvarchar 避免截斷或轉換失敗。-- 啟用 Ad Hoc Distributed Queries
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
-- 使用 ACE OLEDB 12.0/16.0 (適用 .xlsx)
SELECT * INTO dbo.TargetTable
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.16.0',
'Excel 12.0 Xml;HDR=YES;Database=C:\Data\Source.xlsx',
'SELECT * FROM [Sheet1$]'
);
HDR=YES:第一列為標題;HDR=NO 則視為資料。IMEX=1:混合型別欄位視為文字(避免前幾列為數字導致後續文字被讀成 NULL)。$ 並用方括號包裹,如 [Sheet1$];命名範圍則不需 $。專案部署至 SSISDB 目錄,透過 SQL Server Agent 作業排程執行,支援參數化、日誌記錄與失敗重試。
bcp 指令大量匯入:bcp dbo.TargetTable in "C:\Data\Source.csv" -S localhost -U sa -P "pwd" -c -t, -r\n -C 65001 -h "TABLOCK"
-c 字元模式、-t, 欄位分隔符、-r\n 列結束符、-C 65001 UTF-8、-h TABLOCK 最小化記錄。import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mssql+pyodbc://sa:pwd@localhost/DB?driver=ODBC+Driver+17+for+SQL+Server")
df = pd.read_excel("Source.xlsx", sheet_name="Sheet1", dtype=str) # 全讀為字串最保險
df.to_sql("TargetTable", engine, if_exists="append", index=False, chunksize=5000, method="multi")
using (var pkg = new ExcelPackage(new FileInfo("Source.xlsx"))) {
var ws = pkg.Workbook.Worksheets["Sheet1"];
var dt = new DataTable();
// 讀取標題列建立 DataColumn
for (int c = 1; c <= ws.Dimension.End.Column; c++)
dt.Columns.Add(ws.Cells[1, c].Text);
// 讀取資料列
for (int r = 2; r <= ws.Dimension.End.Row; r++) {
var row = dt.NewRow();
for (int c = 1; c <= ws.Dimension.End.Column; c++)
row[c-1] = ws.Cells[r, c].Text;
dt.Rows.Add(row);
}
using (var bcp = new SqlBulkCopy(connStr)) {
bcp.DestinationTableName = "TargetTable";
bcp.BatchSize = 5000;
bcp.WriteToServer(dt);
}
}
若資料已上傳至 Azure Blob/ADLS,可使用複製活動直接從 Excel (Binary) 來源複製至 Azure SQL / SQL Server (Self-hosted IR),支援對應、容錯、排程與監控。
| 方法 | 資料量 | 自動化 | 複雜轉換 | 部署門檻 | 推薦指數 |
|---|---|---|---|---|---|
| 匯入/匯出精靈 | <10萬 | 低 | 低 | 低 | ★★★☆☆ |
| OPENROWSET | <50萬 | 高 | 中 | 中 | ★★★★☆ |
| SSIS | 無上限 | 高 | 高 | 高 | ★★★★★ |
| BCP + CSV | 極大 | 高 | 低 | 低 | ★★★★☆ |
| Python/C# | 中大型 | 高 | 高 | 中 | ★★★★★ |
| ADF/Synapse | 無上限 | 高 | 高 | 雲端 | ★★★★★ |
MAX 型別。根據專案實際情況選擇最適合的方式,並建立標準化匯入流程(驗證、記錄、回滾),即可確保 Excel 資料可靠、高效地進入 SQL Server。