SQL Server 透過 Linked Server 實現異構資料庫查詢。連接 DB2 採用 ODBC → OLE DB Provider for DB2 雙層橋接:
SQL Server (Linked Server)
│
├─ OLE DB Provider: "IBM OLE DB Provider for DB2 SERVERS"
│
└─ System/User DSN (ODBC) → IBM DB2 ODBC DRIVER
│
└─ DB2 Client (CLI) → DB2 Server (TCP/IP 50000)
DB2_LINK。SAMPLE)。SHARE → 確定。LK_DB2_PROD。IBM OLE DB Provider for DB2 SERVERS (必須完全匹配)。DB2。DB2_LINK。User ID=db2user;Password=db2pass; (或 UID=...;PWD=...;)。Data Access、RPC、RPC Out。LK_DB2_PROD → 「表」:右側顯示 DB2 用戶擁有的所有表名。-- 格式:[LinkedServer]..[DB2_Schema].[TableName]
SELECT * FROM [LK_DB2_PROD]..[DB2INST1].[EMPLOYEE];
-- 加入本地表連接
SELECT e.EMPNO, e.LASTNAME, d.DEPTNAME
FROM [LK_DB2_PROD]..[DB2INST1].[EMPLOYEE] e
JOIN LOCAL_DB.dbo.DEPT_MAP d ON e.WORKDEPT = d.DEPTNO;
INSERT INTO [LK_DB2_PROD]..[DB2INST1].[DEPT] (DEPTNO, DEPTNAME, MGRNO)
VALUES ('X01', 'TEST DEPT', '000010');
SELECT/INSERT/UPDATE/DELETE 權限。| 錯誤 | 原因 | 解決 |
|---|---|---|
| 「找不到提供程序」 | OLE DB Provider 未安裝/註冊、名稱拼寫錯誤 | 重裝 DB2 Client、確認註冊表 HKEY_CLASSES_ROOT\IBMDA400 存在 |
| 「登錄失敗」 | DSN 配置錯誤、DB2 用戶/密碼錯誤、DB2 服務未啟動 | ODBC 管理器單獨測試 DSN 連接成功後再建 Linked Server |
| 「分散式交易失敗」 | MSDTC 未啟用/防火牆阻擋 135/動態端口 | 兩端啟用 MSDTC、防火牆開放 RPC 動態端口範圍 |
| 查詢極慢 | 缺乏統計信息、大量跨網路傳輸、未下推謂詞 | 使用 OPENQUERY 下推查詢至 DB2 執行 |
-- 差:SQL Server 拉回全表再過濾
SELECT * FROM [LK_DB2_PROD]..[DB2INST1].[BIG_TABLE] WHERE COL1 = 'A';
-- 優:下推至 DB2 執行,僅傳回結果集
SELECT * FROM OPENQUERY([LK_DB2_PROD], 'SELECT * FROM DB2INST1.BIG_TABLE WHERE COL1 = ''A''');
SQL Server 連接 DB2 的核心鏈路是 Linked Server → IBM OLE DB Provider → System DSN (IBM DB2 ODBC DRIVER) → DB2 Client。逐層驗證 (ODBC 測試 → Linked Server 測試 → OPENQUERY 下推) 是穩健實施的關鍵。配置 MSDTC 支援寫入,善用 OPENQUERY 避免跨網路拉取大量數據,即可實現高效異構查詢整合。