SQL Server 提供 **T-SQL 語句**、**BCP 命令行工具**、**DTS/SSIS 數據轉換服務** 三大導入導出路徑。本文從功能特性、異構支援、性能、編程接口、適用場景五個維度深度對比,給出明確選型決策樹。
| 維度 | T-SQL (OPENROWSET/OPENDATASOURCE) | BCP (Bulk Copy Program) | DTS / SSIS (Data Transformation Services) |
|---|---|---|---|
| 本質 | SQL 語句 / 函數 | 命令行客戶端工具 (DB-Library) | ETR 引擎 + 圖形設計器 + COM 組件 |
| 異構數據源支援 | 通過 OLE DB Provider (OPENROWSET/OPENDATASOURCE) | 支援所有 OLE DB 目標 | 原生支援最豐富 (文本、Excel、Oracle、Flat File、XML、Web Service 等) |
| 數據轉換能力 | 弱 (需在 SQL 中處理) | 無 (純複製) | 極強 (VBScript/JScript/.NET 腳本,行級邏輯、查找、清洗、聚合) |
| 性能 (大數據量) | 中等 (SQL 層開銷) | 最高 (並行批量載入、繞過 SQL 層、極速) | 高 (緩衝區、並行、內存管道) |
| 編程調用 | 原生 (存儲過程/動態 SQL) | xp_cmdshell 調用 / 批處理文件 | COM 組件 / .NET API / dtutil 命令行 |
| 圖形化開發 | 無 | 無 | 完整設計器 (拖拽、屬性、調試、部署) |
| 部署/版本控制 | 腳本文件 | 批處理文件 | 包文件 (.dtsx) / VB 源碼 / 專案部署模型 |
| 學習曲線 | 低 | 低 | 高 (SSIS 架構複雜) |
-- 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');
選擇: 需推送下查詢條件、聯接異構表 → OPENROWSET;單純引用整表 → OPENDATASOURCE。
bcp pubs.dbo.authors OUT c:\temp\authors.txt -c -t, -r\n -S"SERVER\INST" -U"sa" -P"pwd"
# -c 字符模式 -t 欄位分隔符 -r 行分隔符 -S 服務器 -U 用戶 -P 密碼
# 並行導入 (需目標表無索引/觸發器,配合 TABLOCK)
bcp db.dbo.big_table IN data.txt -h"TABLOCK" -c -t, -S"..." -U"..." -P"..."
Function Main()
DTSDestination("姓名") = DTSSource("姓名")
DTSDestination("年齡") = DTSSource("年齡")
If DTSSource("婚姻狀態") = 1 Then
DTSDestination("婚姻狀態") = "已婚"
Else
DTSDestination("婚姻狀態") = "未婚"
End If
Main = DTSTransformStat_OK
End Function
| 方式 | 導出耗時 | 導入耗時 | CPU/內存 | 備註 |
|---|---|---|---|---|
| T-SQL (同庫) | 12s | 15s | 中 | 最簡單 |
| T-SQL (異構 OPENROWSET) | 45s | 60s | 高 | OLE DB 開銷大 |
| BCP (字符模式) | 8s | 10s | 低 | 極速,無轉換 |
| SSIS (無轉換) | 10s | 12s | 中 | 緩衝區優化 |
| SSIS (複雜腳本轉換) | 30s | 40s | 高 | 功能最全 |
開始
│
├─ 數據量 < 10萬行、同庫/同構、無複雜轉換 → **T-SQL (INSERT/SELECT)**
│
├─ 異構數據源、需推送下查詢/過濾 → **T-SQL (OPENROWSET)**
│
├─ 數據量 > 100萬行、純複製/導出、追求極致速度 → **BCP (批處理文件調用)**
│
├─ 需複雜清洗/轉換/查找/聚合/錯誤流 → **SSIS (DTS 升級版)**
│
├─ 程序集成、無複雜轉換、不想寫 SSIS 包 → **T-SQL (OPENROWSET) 或 BCP (xp_cmdshell)**
│
└─ 客戶端無管理工具、Express 版本、快速一次性任務 → **BCP 批處理**
**T-SQL 重「簡單、集成」,BCP 重「速度、批量」,SSIS 重「轉換、治理、企業級」**。根據數據量、異構程度、轉換複雜度、團隊技能、維護成本,在三者中選型。現代數據平台建議:**核心 ETL 用 SSIS,臨時同步用 T-SQL/BCP,構建分層數據集成體系。**