首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

將 Excel 資料匯入 SQL Server 資料表的多種方法總覽

     編輯:關於SqlServer

前言

將 Excel 試算表資料導入 SQL Server 是資料遷移、ETL 與日常維運的常見需求。依據資料量、頻率與環境限制,可選擇圖形化工具、T-SQL 指令、程式碼或 ETL 套件等不同方式。本文系統整理六大主流方法,並說明適用情境與注意事項。

方法一:SQL Server 匯入/匯出精靈(SSMS 內建)

適用情境

  • 一次性、資料量中小型(< 10 萬列)
  • 需視覺化對應欄位、資料型別轉換
  • 無程式開發環境

操作步驟

  1. SSMS 物件總管 → 以滑鼠右鍵點擊目標資料庫 → 工作 → 匯入資料。
  2. 資料來源選 Microsoft Excel,瀏覽 .xls/.xlsx 檔案,勾選「第一列包含資料行名稱」。
  3. 目的地選 SQL Server Native Client,指定伺服器、驗證方式、目標資料庫。
  4. 選擇「從來源資料表複製資料」或「撰寫查詢指定要傳輸的資料」。
  5. 對應來源工作表與目標資料表,可點擊 編輯對應 調整資料型別、長度、Nullability。
  6. 執行並檢查結果。

注意事項

  • 64 位元 SQL Server 需安裝 Microsoft Access Database Engine 64-bit (ACE OLEDB Provider),否則會出現「找不到提供者」錯誤。
  • Excel 欄位若混雜文字與數字,建議在精靈中將該欄對應為 nvarchar 避免截斷或轉換失敗。

方法二:OPENROWSET / OPENDATASOURCE (T-SQL)

適用情境

  • 需在預存程序、作業排程中自動化匯入
  • 資料庫引擎可直接存取 Excel 檔案路徑(本機或共享資料夾)

前置設定

-- 啟用 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$];命名範圍則不需 $。

方法三:SQL Server Integration Services (SSIS)

適用情境

  • 企業級 ETL、定期排程、複雜轉換邏輯
  • 需錯誤處理、記錄、資料清洗、多來源整合

核心元件

  • Excel 來源:支援 .xls/.xlsx、動態檔案路徑(透過變數/運算式)。
  • 資料轉換:衍生欄位、資料轉換、查閱、條件分割等。
  • OLE DB 目的地:快速大量載入、資料表鎖定、檢查點。

部署與排程

專案部署至 SSISDB 目錄,透過 SQL Server Agent 作業排程執行,支援參數化、日誌記錄與失敗重試。

方法四:BCP 工具 + CSV 中繼

適用情境

  • 超大量資料(百萬列以上),追求極致效能
  • 無法安裝 ACE Provider 的環境

流程

  1. Excel 另存為 CSV (UTF-8)。
  2. 使用 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 最小化記錄。

方法五:Python / C# 程式碼匯入

Python (pandas + pyodbc/sqlalchemy)

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")

C# (EPPlus + SqlBulkCopy)

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 Data Factory / Synapse Pipeline(雲端/混合)

若資料已上傳至 Azure Blob/ADLS,可使用複製活動直接從 Excel (Binary) 來源複製至 Azure SQL / SQL Server (Self-hosted IR),支援對應、容錯、排程與監控。

效能與選型建議摘要表

方法資料量自動化複雜轉換部署門檻推薦指數
匯入/匯出精靈<10萬低低低★★★☆☆
OPENROWSET<50萬高中中★★★★☆
SSIS無上限高高高★★★★★
BCP + CSV極大高低低★★★★☆
Python/C#中大型高高中★★★★★
ADF/Synapse無上限高高雲端★★★★★

常見坑點與對策

  • 資料型別推測錯誤:Excel 無強型別,建議匯入前統一轉為文字,或在目標表使用暫存表 + 明確 CAST。
  • 日期格式不一:Excel 日期為雙精度數值,匯入時需確認 1900/1904 日期系統差異。
  • 儲存格超長文字:目標欄位長度需足夠,或啟用 MAX 型別。
  • ACE Provider 版本衝突:64 位元 SQL Server 必須安裝 64 位元 ACE;不可同時安裝 32/64 位元 Office 與 ACE。
  • 權限問題:SQL Server 服務帳號需具備 Excel 檔案資料夾的讀取權限(OPENROWSET/BCP/SSIS 本機路徑)。

根據專案實際情況選擇最適合的方式,並建立標準化匯入流程(驗證、記錄、回滾),即可確保 Excel 資料可靠、高效地進入 SQL Server。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved