首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 分散式查詢完整指南:架構、實作與疑難排解

     編輯:關於SqlServer

前言

分散式查詢讓 SQL Server 能在單一陳述式中存取多個資料源 (SQL Server、Oracle、ODBC 等) 的資料。本文從系統架構切入,詳細說明「連結伺服器」與「臨時名稱 (OPENROWSET/OPENDATASOURCE)」兩大實作模式,並提供完整配置腳本、權限設定、常見錯誤排查與進階資料搬移技巧。

一、 核心架構與 OLE DB 角色

SQL Server 透過 OLE DB 提供者存取外部資料源。提供者將資料公開為「資料列集」,SQL Server 可在 T-SQL 中像操作本地表一樣引用它。客戶端 → SQL Server → OLE DB Provider → 遠端資料源 (SQL/Oracle/Access/文字檔...)。

系統架構圖

分散式查詢架構圖

二、 兩大實作模式對比

特性連結伺服器OPENROWSET / OPENDATASOURCE
持久性永久物件,元資料儲存於 master臨時、即時指定,無持久化
適用場景固定、高頻、大批量跨伺服器存取臨時、探勘性、低頻查詢
安全性管理集中管理登入映射、權限連接字串內含帳密,風險較高
效能計畫可重用,連線池優化每次重新解析、建立連線,不適合大量資料
語法sp_addlinkedserver + 四段式命名OPENROWSET(provider, conn_str, query)

三、 連結伺服器完整建立腳本 (SQL Server 2005+)

1. 簡易模式 (同網域、信任連接)

EXEC sp_addlinkedserver @server = '192.168.10.104', @srvproduct = 'SQL Server';
-- 驗證
SELECT name, product, provider, data_source FROM sys.servers WHERE is_linked = 1;

2. 進階模式 (指定 Provider、跨網域、SQL 驗證)

-- 清理舊物件
EXEC sp_droplinkedsrvlogin 'demodb', NULL;
EXEC sp_dropserver 'demodb', 'droplogins';

-- 建立連結伺服器
EXEC sp_addlinkedserver
    @server = 'demodb',
    @srvproduct = '',
    @provider = 'SQLOLEDB',
    @datasrc = '192.168.10.76';

-- 建立登入映射 (本地登入 -> 遠端帳密)
EXEC sp_addlinkedsrvlogin
    @rmtsrvname = 'demodb',
    @useself = 'false',
    @locallogin = NULL,
    @rmtuser = 'Test',
    @rmtpassword = 'RemoteDB';

-- 查詢驗證
SELECT * FROM [demodb].CustomerDB.dbo.Users;

查詢結果驗證

3. 關鍵前置條件:遠端伺服器設定

  • 遠端 SQL Server 啟用「遠端連接」 (Surface Area Configuration)。
  • TCP/IP、Named Pipes 協定啟用。
  • SQL Server Browser 服務啟動 (命名實例必須)。
  • 防火牆開放 1433 (預設) / 1434 (Browser) 埠。
  • 本地與遠端 sa 密碼一致 時,簡易模式才能用信任連接;否則必須用進階模式指定帳密。
  • XP 系統需打 SP4 补丁,否則 SQL 2005 連線會失敗。

四、 臨時名稱查詢 (OPENDATASOURCE / OPENROWSET)

啟用 Ad Hoc Distributed Queries

EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;

查詢範例

-- OPENDATASOURCE
SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=192.168.10.67;User ID=sa;Password=pwd').CustomerDB.dbo.Users;

-- OPENROWSET (支援複雜查詢)
SELECT * FROM OPENROWSET('SQLOLEDB', 'Server=192.168.10.67;UID=sa;PWD=pwd', 'SELECT * FROM CustomerDB.dbo.Users WHERE Id > 100');

五、 進階資料搬移與 DML 操作

-- 遠端資料導入本地 (SELECT INTO)
SELECT * INTO LocalCopyDB FROM [demodb].CustomerDB.dbo.Users;
-- 注意:LocalCopyDB 不會繼承 PK、Index、Constraint

-- 本地資料導入遠端
INSERT INTO [demodb].CustomerDB.dbo.Users SELECT * FROM LocalTable;

-- 跨伺服器 UPDATE
UPDATE b SET b.ColA = a.ColA
FROM OPENROWSET('SQLOLEDB', 'Server=Remote;UID=sa;PWD=pwd', 'SELECT ColA, PK FROM RemoteDB.dbo.RemoteTable') a
INNER JOIN LocalTable b ON a.PK = b.PK;

-- 分散式交易 (需 MSDTC 啟用)
BEGIN DISTRIBUTED TRANSACTION;
INSERT INTO [demodb].DB.dbo.T1 VALUES (...);
INSERT INTO [localdb].DB.dbo.T2 VALUES (...);
COMMIT TRANSACTION;

六、 常見錯誤排查清單

  1. 無法建立連接/逾時: 檢查遠端服務狀態、Surface Area 遠端連接、防火牆、Browser 服務、SP4 补丁 (XP)。
  2. 進程被佔用 (無法獨佔存取): 查詢 sys.sysprocesses 找出阻塞 SPID,KILL 使用者進程 (系統進程不可 KILL)。
  3. 登入失敗: 確認連結伺服器安全性頁籤映射、遠端帳密、SQL/Windows 驗證模式一致性。
  4. 分散式查詢權限不足: 確認已啟用 Ad Hoc Distributed Queries 且執行帳號有權限。

七、 總結

連結伺服器適合生產環境固定、高頻、需安全管理的跨伺服器存取;OPENROWSET/OPENDATASOURCE 適合開發測試、臨時探勘。掌握 OLE DB 提供者特性、登入映射機制、MSDTC 分散式交易配置,是穩健實作分散式查詢的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved