架構總覽
SQL Server 透過 **Linked Server** + **OLE DB Provider for DB2** + **DB2 ODBC Driver** 實現異構查詢。
環境需求
- OS:Windows Server 2000/2003/2008+
- SQL Server 2000/2005+
- DB2 Client(含 ODBC Driver、OLE DB Provider)安裝於 SQL Server 主機
步驟 1:建立系統 DSN (ODBC)
- 控制台 → 系統管理工具 → 資料來源 (ODBC) → 系統 DSN → 新增
- 選 **IBM DB2 ODBC DRIVER**
- 資料來源名稱:自訂(如 `DB2TEST`)
- 資料庫名稱:**必填**,對應 DB2 端編目別名
- 完成 → 設定 → 測試連線(輸入 DB2 User/Password,Connection Mode 選 SHARE)
步驟 2:建立 Linked Server
- 企業管理器 / SSMS → 安全性 → 連結伺服器 → 新增
- 連結伺服器名稱:自訂(如 `LNK_DB2`)
- 伺服器類型:**其他資料來源**
- 提供者:**IBM OLE DB Provider for DB2 SERVERS**
- 資料來源:步驟 1 的 DSN 名稱(`DB2TEST`)
- 提供者字串:`User ID=db2user;Password=db2pwd` 或 `UID=db2user;PWD=db2pwd`
- 安全性頁籤:**「使用此安全性內容」** → 輸入 DB2 遠端登入帳密
- 伺服器選項:預設即可
步驟 3:驗證與查詢
- 展開連結伺服器 → 資料表,可見遠端 Schema 下所有表。
- 查詢語法(四部份命名):
SELECT * FROM [LNK_DB2]..[DB2_SCHEMA].[TABLE_NAME]
- 僅支援 `SELECT`/`INSERT`/`UPDATE`/`DELETE`;DDL 需直接在 DB2 執行。
常見問題排查
| 現象 | 原因 | 對策 |
| 「找不到提供者」 | 未安裝 DB2 OLE DB Provider | DB2 Client 安裝時勾選「OLE DB Provider」 |
| 連線測試成功但查詢失敗 | Provider String 帳密錯誤或權限不足 | 確認 DB2 端該用戶有 SELECT 權限 |
| 中文亂碼 | Codepage 不匹配 | DB2 Client `db2set DB2CODEPAGE=1208` (UTF-8) 或匹配 SQL Server 定序 |
| 分散式交易失敗 | MSDTC 未啟用/防火牆阻擋 | 啟用 MSDTC、開放 135/動態埠 |
效能建議
- 使用 `OPENQUERY` 下推過濾:
SELECT * FROM OPENQUERY(LNK_DB2, 'SELECT * FROM SCHEMA.TAB WHERE COL=1')
- 避免大結果集跨網路傳輸,必要時在 DB2 建立檢視/預存程序再遠端呼叫。
- 定期更新 DB2 統計資訊,確保 SQL Server 優化器取得正確基數估算。