在 Instance01 中直接查詢、寫入 Instance02 的資料,例如跨實例資料遷移:
INSERT INTO Instance01.DB01.dbo.Table01
SELECT * FROM Instance02.DB01.dbo.Table01;
預設情況下 SQL Server 禁止跨實例存取,需透過 連結伺服器 機制實現。
sp_addlinkedserver
[ @server= ] 'server' -- 連結伺服器別名
[ , [ @srvproduct= ] 'product_name' ] -- 產品名稱
[ , [ @provider= ] 'provider_name' ] -- OLE DB 提供者
[ , [ @datasrc= ] 'data_source' ] -- 資料來源(IP/主機名)
[ , [ @location= ] 'location' ] -- 位置
[ , [ @provstr= ] 'provider_string' ] -- 連接字串
[ , [ @catalog= ] 'catalog' ] -- 預設目錄/資料庫
-- 在 Instance01 執行
EXEC sp_addlinkedserver 'Instance02'; -- 僅指定別名,預設 SQL Server Native Client
GO
-- 此後即可使用四段式名稱存取
SELECT * FROM Instance02.DB01.dbo.Table01;
當兩實例無共同網域帳號,需建立登入映射:
EXEC sp_addlinkedsrvlogin 'Instance02', 'true';
-- 含義:目前登入 Instance01 的 Windows 帳號直接用於連線 Instance02
EXEC sp_addlinkedsrvlogin
'Instance02', -- 連結伺服器名
'false', -- 不使用自對應
'TJVictor', -- 本地登入帳號
'sa', -- 遠端對應帳號
'Password1'; -- 遠端密碼
-- 含義:當本地用戶 TJVictor 登入 Instance01 存取 Instance02 時,以 sa/Password1 身分連線
sp_addlinkedserver 註冊目標實例sp_addlinkedsrvlogin 建立映射SELECT * FROM [LinkedSrv].[DB].[schema].[Table]ping Instance02 或在 hosts 檔加入映射,或直接用 IP 建立連結伺服器| 物件 | 用途 | 範例 |
|---|---|---|
sp_helpserver | 列出已註冊連結伺服器 | EXEC sp_helpserver |
sys.servers | 系統檢視,功能同 sp_helpserver | SELECT * FROM sys.servers |
sys.linked_logins | 檢視登入映射 | SELECT * FROM sys.linked_logins |
sp_dropserver | 移除連結伺服器 | EXEC sp_dropserver 'Instance02', 'droplogins' |
sp_droplinkedsrvlogin | 移除特定登入映射 | EXEC sp_droplinkedsrvlogin 'Instance02', 'TJVictor' |
@provstr 明文寫入密碼,優先使用 sp_addlinkedsrvlogin 管理認證db_datareader/db_datawritersys.linked_logins 移除廢棄映射rpc out 選項:EXEC sp_serveroption 'Instance02', 'rpc out', 'true'| 錯誤現象 | 可能原因 | 解決方向 |
|---|---|---|
| 「找不到伺服器」 | DNS 無法解析連結伺服器名稱 | 用 IP 建立、修改 hosts、檢查網路連通 |
| 「登入失敗」 | 映射帳號密碼錯誤或權限不足 | 驗證 sp_addlinkedsrvlogin 參數、遠端授權 |
| 「分散式交易失敗」 | MSDTC 服務未啟動或防火牆阻擋 | 啟動 MSDTC、開放 135/動態埠、設定網路 DTC 存取 |
| 效能極差 | 大量資料跨實例 JOIN、缺乏索引 | 拉回本地暫存表處理、使用 OPENQUERY 下推查詢 |