面對異構資料來源、大量資料遷移、ETL 淨化轉換,SQL Server 提供三大主流方案:T-SQL 語句(OPENROWSET/OPENDATASOURCE)、BCP 命令列工具、DTS/SSIS(資料轉換服務/Integration Services)。本文從使用方式、靈活度、效能、程式化呼叫、適用場景五大維度深度對比,助你精準選型。
| 特性 | OPENDATASOURCE | OPENROWSET |
|---|---|---|
| 用途 | 建立臨時連結伺服器參考 | 直接回傳資料列集(可當表用) |
| 語法 | OPENDATASOURCE(provider, conn_str) | OPENROWSET(provider, conn_str, query) |
| 彈性 | 僅能引用遠端表/檢視,過濾需在本端 WHERE | 可在遠端直接執行查詢/過濾/聚合 |
| 適用場景 | 臨時查詢遠端單一表 | 複雜異構查詢、將遠端結果直接 JOIN 本地表 |
-- OPENDATASOURCE
SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\data\abc.mdb;User ID=admin;Password=;')...table1;
-- OPENROWSET(更彈性)
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\data\abc.mdb'; 'admin'; '', 'SELECT * FROM table1 WHERE id > 100');
.fmt) 精確對應欄位型別、終止符、固定寬度。BULK INSERT / OPENROWSET(BULK...)。# 匯出 authors 表至 Excel(實為 tab-delimited text)
bcp pubs.dbo.authors out c:\temp\authors.xls -c -t, -T -S localhost
# 匯入(需目標表存在、權限足夠)
bcp pubs.dbo.authors in c:\temp\authors.xls -c -t, -T -S localhost -b 10000 -h "TABLOCK"
# 透過 xp_cmdshell 在 T-SQL 中呼叫
EXEC master..xp_cmdshell 'bcp pubs.dbo.authors out c:\temp\authors.xls -c -t, -T -S localhost';
參數速查:-c 字元模式、-t, 欄位分隔符、-T 信任連線、-b 批次大小、-h TABLOCK 鎖表加速。
Microsoft.SqlServer.Dts.Runtime 組件載入/執行/監控封裝。| 場景 | 首選工具 | 備選 | 關鍵理由 |
|---|---|---|---|
| SQL Server 之間單表/全庫遷移,無複雜轉換 | T-SQL (SELECT INTO / INSERT SELECT) | BCP | 語法原生、無外部相依、效能佳 |
| 異構來源 定期全量/增量同步,需簡單清洗 | SSIS | T-SQL + Agent Job | 視覺化維護、內建查閱/轉換、錯誤處理完善 |
| 超大量資料 (TB 級) 初始載入/重建索引 | BCP / BULK INSERT | SSIS (Fast Parse、平行) | 極致吞吐、最小日誌、平行化 |
| 應用程式內嵌匯入匯出功能 | T-SQL (OPENROWSET) 或 SMO | SSIS 程式化呼叫 | 輕量、無額外安裝 |
| 複雜 ETL:多來源合併、SCD、資料品質規則 | SSIS | 無 | 唯一能勝任的原生平台 |
TABLOCK、資料庫 SIMPLE 或 BULK_LOGGED 恢復模式。-b 10000 (BCP) / ROWS_PER_BATCH (BULK INSERT),平衡記憶體與鎖持有時間。