跨伺服器查詢、同步、異構資料整合(SQL→SQL、SQL→Oracle 等)。
2000 僅支援 OPENROWSET/OPENDATASOURCE/OPENQUERY 臨時查詢,功能弱、擴展性差。2005 引入 SSMS 圖形化「連結伺服器」物件,建立一次永久物件,後續像本地表一樣 DML 查詢。
ETV2_LINK)、提供者 SQLNCLI、資料來源 (遠端實例名,如 BWA035\BWA035_2K5)。


預設 RPC 為 False,需手動啟用,否則無法執行遠端預存程序或參數化查詢。


右鍵連結伺服器 → 屬性 → 伺服器選項 → RPC = True, RPC Out = True。
USE master;
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'rpc', @optvalue = N'true';
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'rpc out', @optvalue = N'true';
GO
右鍵已建立的連結伺服器 → 【編寫連結伺服器腳本為】 → 【建立至】 → 【新增查詢編輯器視窗】。輸出範例:
EXEC master.dbo.sp_addlinkedserver @server = N'ETV2_LINK', @srvproduct = N'ETV2_LINK',
@provider = N'SQLNCLI', @datasrc = N'BWA035\BWA035_2K5';
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'collation compatible', @optvalue = N'false';
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'data access', @optvalue = N'true';
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'rpc', @optvalue = N'true';
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'rpc out', @optvalue = N'true';
GO
EXEC master.dbo.sp_serveroption @server = N'ETV2_LINK', @optname = N'use remote collation', @optvalue = N'true';
GO
-- 其餘選項略...
修改 @server、@datasrc 即可快速複刻至其他環境。
-- 四部分命名:[連結伺服器].[遠端資料庫].[結構描述].[表]
SELECT * FROM ETV2_LINK.[etV2_Online].dbo.VisiteLog_20100629;
IF EXISTS (SELECT * FROM ETV2_LINK.[etV2_Online].sys.objects
WHERE name = N'VisiteLog_20100629' AND type IN (N'U'))
BEGIN
PRINT N'存在表';
-- 後續邏輯
END;
注意:查遠端系統表必須用 sys.objects,不可用舊式 sysobjects。
DECLARE @IsExistTable VARCHAR(10) = 'False';
DECLARE @TableName VARCHAR(50) = 'VisiteLog_' + CONVERT(VARCHAR(8), GETDATE()-1, 112);
DECLARE @sqlString NVARCHAR(4000) =
N'IF EXISTS (SELECT * FROM ETV2_LINK.[etV2_Online].sys.objects
WHERE name = @tname AND type IN (N''U''))
SET @result = ''True'';';
EXEC sp_executesql @sqlString,
N'@tname NVARCHAR(50), @result VARCHAR(10) OUTPUT',
@tname = @TableName, @result = @IsExistTable OUTPUT;
IF @IsExistTable = 'True'
PRINT N'存在表';
-- 方法 1
SELECT * FROM OPENROWSET('SQLOLEDB', 'server=192.168.0.67;uid=sa;pwd=password',
'SELECT * FROM BCM2.dbo.tbAppl');
-- 方法 2
SELECT * FROM OPENROWSET('SQLOLEDB', '192.168.0.67', 'sa', 'password',
'SELECT * FROM BCM2.dbo.tbAppl');