企業級應用常面臨跨資料庫、跨伺服器查詢需求。SQL Server 提供連結伺服器機制,透過 OLE DB 提供者,讓本地實例能像操作本地表一樣存取遠端異構資料源(SQL Server、Oracle、MySQL、Excel 等)。
EXEC sp_addlinkedserver
@server = 'LinkedSrvName', -- 連結伺服器邏輯名稱
@srvproduct = '', -- 產品名稱 (SQL Server 可留空)
@provider = 'SQLOLEDB', -- OLE DB Provider
@datasrc = 'RemoteIP_or_Name'; -- 遠端伺服器位址
| 參數 | 說明 | 備註 |
|---|---|---|
| @server | 本地邏輯名稱,後續查詢用此名稱 | sysname, 必填 |
| @srvproduct | OLE DB 資料源產品名 | SQL Server 可為 NULL |
| @provider | OLE DB Provider PROGID | 預設 SQLNCLI (SQL Native Client) |
| @datasrc | 資料源名稱/IP/實例名 | 對應 DBPROP_INIT_DATASOURCE |
| @location | 資料庫位置 | 可選 |
| @provstr | Provider 連接字串 | 可指定加密、逾時等進階屬性 |
| @catalog | 預設目錄/資料庫 | 對應 DBPROP_INIT_CATALOG |
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'LinkedSrvName', -- 對應的連結伺服器
@useself = 'false', -- false: 使用指定帳密; true: 用當前登入憑證
@locallogin = NULL, -- 本地登入 (NULL 套用所有)
@rmtuser = 'RemoteUser', -- 遠端登入帳號
@rmtpassword = 'RemotePwd'; -- 遠端密碼
權限需求: 需 `ALTER ANY LINKED SERVER` 權限;`sp_addlinkedsrvlogin` 需 `ALTER ANY LOGIN`。不可在使用者定義交易中執行。
-- 1. 建立連結伺服器指向遠端 SQL Server
EXEC sp_addlinkedserver
@server = 'ERP_Server',
@provider = 'SQLNCLI',
@datasrc = '192.168.10.50\ERPINST';
-- 2. 設定統一 SQL 認證登入
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'ERP_Server',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'erp_readonly',
@rmtpassword = 'Str0ngP@ssw0rd';
SELECT * FROM [連結伺服器名].[資料庫名].[結構名].[表名];
-- 範例
SELECT * FROM [ERP_Server].[ERP_DB].[dbo].[Orders];
SELECT * FROM OPENQUERY(ERP_Server, 'SELECT OrderID, CustID FROM Orders WHERE OrderDate > ''2023-01-01''');
| 錯誤現象 | 可能原因 | 解決方向 |
|---|---|---|
| 「登入失敗」 | 帳密錯誤、遠端不允許 SQL 認證 | 檢查遠端「安全性」→「伺服器驗證模式」為混合模式 |
| 「找不到伺服器」 | DNS/主機名解析失敗 | 改用 IP 或在 hosts 檔案映射 |
| 「分散式交易失敗」 | MSDTC 未啟用/防火牆阻擋 | 服務啟用、防火牆開放 135/動態埠 |
| 查詢極慢 | 未下推條件、缺乏索引、大量資料傳輸 | 改用 OPENQUERY、加遠端索引、分頁抓取 |