三大方法概覽
| 方法 | 核心機制 | 優勢 | 劣勢 | 適用場景 |
| T-SQL | SELECT INTO / INSERT INTO / OPENDATASOURCE / OPENROWSET | SQL Server 之間極快、語法熟悉 | 異構資料庫需 OLE DB Provider、複雜轉換困難 | 同質資料庫間簡單遷移、合併 |
| BCP | 命令列工具,基於 DB-Library | 平行載入極快、支援腳本自動化 | 無圖形介面、程式調用繁瑣 (需 xp_cmdshell)、不支援資料驗證/轉換 | 大量資料快速載入、客戶端無管理工具環境 |
| DTS | 圖形化設計器 + COM 元件 + 腳本 (VBScript/JScript) | 深度資料驗證/淨化/轉換、視覺化流程、支援 COM 程式化 | 程式介面複雜、學習曲線陡峭 | 複雜 ETL、異構資料整合、需行級轉換邏輯 |
T-SQL 異構資料存取細節
OPENDATASOURCE vs OPENROWSET
| 特性 | OPENDATASOURCE | OPENROWSET |
| 呼叫方式 | 兩參數 (Provider, 連線字串),後接物件名 | 單一行集函數,可內嵌查詢 |
| 彈性 | 僅能引用表/視圖,過濾需在 SQL Server 端 | 可在開啟時過濾 (如 SELECT * FROM table1) |
| 範例 | SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','...')...table1 | SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','abc.mdb','admin','','SELECT * FROM table1') |
DTS 行級轉換範例 (VBScript)
Function Main()
DTSDestination("姓名") = DTSSource("姓名")
DTSDestination("年齡") = DTSSource("年齡")
If DTSSource("婚姻狀況") = 1 Then
DTSDestination("婚姻狀況") = "已婚"
Else
DTSDestination("婚姻狀況") = "未婚"
End If
Main = DTSTransformStat_OK
End Function
效能比較
- 同質 SQL Server:T-SQL 最快
- 無驗證需求大量載入:BCP 最快 (C 介面 DB-Library)
- 綜合效率與彈性:DTS 最佳 (整合 UDA + ActiveX)
選型決策樹
- SQL Server 之間、無複雜轉換 → T-SQL
- 需複雜驗證/轉換/異構整合 → DTS
- 大量資料、無驗證、腳本自動化、客戶端輕量 → BCP (批次檔調用)
- 程式內嵌匯入匯出、資料量中小、無複雜轉換 → OPENDATASOURCE/OPENROWSET
總結
SQL Server 提供豐富工具鏈,關鍵在於依資料來源同質性、轉換複雜度、自動化需求、部署環境四大維度選型。建議團隊建立內部選型規範,避免專案間採用不一致工具增加維護成本。