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

SQL Server 2005 連結伺服器完整指南:建立、RPC 啟用、腳本部署與四大實戰場景

     編輯:SQL Server 2005

適用場景

跨伺服器查詢、同步、異構資料整合(SQL→SQL、SQL→Oracle 等)。

2000 vs 2005 差異

2000 僅支援 OPENROWSET/OPENDATASOURCE/OPENQUERY 臨時查詢,功能弱、擴展性差。2005 引入 SSMS 圖形化「連結伺服器」物件,建立一次永久物件,後續像本地表一樣 DML 查詢。

建立步驟 (SSMS 圖形化)

  1. 展開【伺服器對象】→【連結伺服器】右鍵【新增連結伺服器】。
  2. 一般頁籤:名稱 (如 ETV2_LINK)、提供者 SQLNCLI、資料來源 (遠端實例名,如 BWA035\BWA035_2K5)。
  3. 安全性頁籤:選「使用此安全性內容建立連線」,輸入遠端登入帳密。
  4. 確定建立。

新增連結伺服器入口

一般頁籤配置

安全性頁籤配置

關鍵設定:啟用 RPC (遠程程序呼叫)

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

預設 RPC 關閉

正確 RPC 開啟

SQL 2005 圖形化:

右鍵連結伺服器 → 屬性 → 伺服器選項 → RPC = True, RPC Out = True。

SQL 2008+ 僅支援 T-SQL 修改:

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 即可快速複刻至其他環境。

四大實戰使用場景

場景 1:跨伺服器查詢表資料

-- 四部分命名:[連結伺服器].[遠端資料庫].[結構描述].[表]
SELECT * FROM ETV2_LINK.[etV2_Online].dbo.VisiteLog_20100629;

場景 2:判斷遠端資料庫是否存在某表

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。

場景 3:參數化表名動態判斷並回傳變數

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'存在表';

場景 4:SQL 2000 相容寫法 (參考)

-- 方法 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');
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved