企業歷史資料常散落在 Access (.mdb/.accdb) 或 Excel (.xls/.xlsx) 檔案中。升級至 SQL Server 後,仍需定期從這些檔案型資料源抽取、同步或回寫資料。本文整理三大主流技術——分散式查詢、DTS/SSIS、BCP——並提供即用的 T-SQL 範本。
| 技術 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 分散式查詢 (OPENROWSET/OPENDATASOURCE) | Ad-hoc、單一陳述式完成、無須建立連結伺服器 | 需啟用 Ad Hoc Distributed Queries、權限設定較繁、大量資料效能較差 | 臨時查詢、小量資料同步、跨伺服器即時聯結 |
| DTS (SQL 2000) / SSIS (2005+) | 圖形化、支援複雜 ETL 流程、錯誤處理、排程、封裝部署 | 學習曲線較陡、套件維護成本 | 定期批次匯入/匯出、異構資料轉換、企業級 ETL |
| BCP (Bulk Copy Program) | 極高效能、低記憶體、命令列自動化、支援格式檔 | 僅支援文字/原生格式、不支援直接寫入 Excel 二進位、錯誤處理弱 | 大量資料初始載入、離線備份、跨平台文字檔交換 |
-- 查詢
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\Data\db.accdb;', 'SELECT * FROM serv_user');
-- 寫入 (需目標表存在)
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\Data\db.accdb;', 'SELECT * FROM AccessTable')
SELECT * FROM SQLTable;
-- 刪除/更新
DELETE FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\Data\db.accdb;', 'SELECT * FROM serv_user') WHERE lock = 0;
UPDATE OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\Data\db.accdb;', 'SELECT * FROM serv_user')
SET lock = 1;
注意:64 位元 SQL Server 必須安裝 64 位元 Access Database Engine (ACE.OLEDB.12.0/16.0),舊版 Jet OLEDB 4.0 僅支援 32 位元。
-- 查詢 (HDR=YES 表頭視為欄位名,工作表名需加 $ 並用方括號)
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=YES;Database=C:\Data\book.xlsx;', 'SELECT * FROM [Sheet1$]')
WHERE [ClientName] LIKE '%台積%';
-- 匯入建新表
SELECT * INTO NewTable FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=YES;Database=C:\Data\book.xlsx;', 'SELECT * FROM [Sheet1$]');
-- 匯出到既有 Excel (需先建立工作表與表頭)
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=YES;Database=C:\Data\book.xlsx;', 'SELECT * FROM [Sheet1$]')
SELECT * FROM SQLTable;
REM 匯出資料表至文字檔 (逗點分隔、含表頭)
bcp "SELECT * FROM Db.dbo.Table" queryout "C:\Export\data.csv" -c -t, -T -S.
REM 匯入文字檔至資料表 (需格式檔或目標表結構相符)
bcp Db.dbo.Table in "C:\Import\data.csv" -c -t, -T -S. -h "TABLOCK"
關鍵參數:-c 字元模式、-t, 欄位分隔符、-T 信任連線、-h "TABLOCK" 大量匯入鎖定優化。
EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'Ad Hoc Distributed Queries',1; RECONFIGURE;SQL Server 2016+ 內建 OPENJSON、PolyBase,Azure 資料工廠 (ADF) 提供無伺服器 ETL。若資料量大、頻率高、來源雲端化,建議逐步遷移至 SSIS/ADF/PolyBase 架構,降低維運複雜度。