SQL Server 2000 透過連結伺服器存取 SQL Server 6.5 時,嘗試直接 JOIN 兩個遠端資料表(A、B)並加上 WHERE 條件,遭遇語法錯誤或效能極差(網路傳輸大量資料)。SQL 6.5 為舊版本,分散式查詢支援有限。
-- 遠端兩表
-- A (ID, filed1)
-- B (ID, filed2)
-- 期望:JOIN 並篩選
SELECT A.ID, A.filed1, B.filed2
FROM RemoteServer.RemoteDB.dbo.A A
INNER JOIN RemoteServer.RemoteDB.dbo.B B ON A.ID = B.ID
WHERE A.ID IN (條件清單);
-- 步驟 1:建立本地暫存表
CREATE TABLE #temp_result (
ID INT,
filed1 VARCHAR(100),
filed2 VARCHAR(100)
);
-- 步驟 2:先抓取 A 表符合條件的資料(減少跨網路傳輸量)
INSERT INTO #temp_result (ID, filed1)
SELECT ID, filed1
FROM RemoteServer.RemoteDB.dbo.A
WHERE ID IN (條件清單);
-- 步驟 3:更新暫存表補齊 B 表欄位
UPDATE #temp_result
SET filed2 = B.filed2
FROM RemoteServer.RemoteDB.dbo.B B
WHERE #temp_result.ID = B.ID;
-- 步驟 4:取得最終結果
SELECT * FROM #temp_result;
-- 步驟 5:清理
DROP TABLE #temp_result;
| 優勢 | 說明 |
|---|---|
| 減少網路傳輸 | 步驟 2 只傳回符合條件的 A 表資料,而非全表 |
| 繞過分散式 JOIN 限制 | 將 JOIN 拆解為兩次單表查詢 + 本地 UPDATE,相容舊版本 |
| 可控制批次大小 | 條件清單可分批處理,避免單次交易過大 |
| 錯誤隔離 | 單表查詢失敗易排查,分散式 JOIN 錯誤訊息往往模糊 |
-- 讓篩選條件在遠端 SQL 6.5 執行,只回傳結果
INSERT INTO #temp_result (ID, filed1)
SELECT ID, filed1
FROM OPENQUERY(LinkedServer,
'SELECT ID, filed1 FROM A WHERE ID IN (條件清單)');
OPENQUERY 將完整查詢傳送至遠端執行,減少網路往返與本地處理。Data Access、RPC Out 選項。OPENROWSET / OPENQUERY 搭配參數化查詢。bcp/SSIS 匯出匯入替代分散式查詢。暫存表分步法雖非標準 SQL 模式,但在異構、舊版本、高延遲網路環境下,往往是最務實、最穩健的解法。