Sql-Server

從連結伺服器獲取@@SERVERNAME

  • August 29, 2019

這似乎是一個基本問題,但我找不到任何答案 - 我需要能夠從連結伺服器獲取伺服器名稱/實例等。我嘗試了幾件事:

select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');

……但沒有喜悅。有任何想法嗎?

這是SQL 2008 R2& 2014(2008R2是連結伺服器)

編輯:錯誤是:

消息 102,級別 15,狀態 1,第 2 行“@@SERVERNAME”附近的語法不正確。

您可以OPENQUERY 按照 MSDN 中的說明使用來獲取連結伺服器的資訊:

即使用OPENQUERY ( linked_server ,'query' )

像下面這樣的東西會給你使用sys.dm_exec_connectionsdmv 的伺服器名稱

SELECT * FROM OPENQUERY (
        linkedservername, 
        'SELECT
            @@SERVERNAME AS TargetServerName,
            SUSER_SNAME() AS ConnectedWith,
            DB_NAME() AS DefaultDB,
            client_net_address AS IPAddress
         FROM
             sys.dm_exec_connections
         WHERE
             session_id = @@SPID
       ')

一些稍微短一些(更自然,恕我直言)的方法:

EXEC LinkedServer.[master].sys.sp_executesql N'SELECT @@VERSION;';

要麼:

EXEC('SELECT @@VERSION;') AT LinkedServer;

我更喜歡這sp_executesql條路線,因為:

  1. 它仍然允許強類型參數,而不是處理各種字元串連接、單引號轉義等。
  2. 在該路徑中指定特定數據庫很容易,而不必在查詢中引用的所有對像上放置數據庫前綴。是的,您可以動態定義數據庫:
DECLARE @db SYSNAME, @exec NVARCHAR(1024);
SET @db = N'tempdb';
SET @exec = N'LinkedServer.' + QUOTENAME(@db) + N'.sys.sp_executesql';
EXEC @exec N'SELECT @@VERSION, DB_NAME();';

如果需要,連結伺服器名稱也是:

DECLARE @srv SYSNAME, @db SYSNAME, @exec NVARCHAR(1024);
SET @srv = N'LinkedServer';
SET @db = N'tempdb';
SET @exec = QUOTENAME(@srv) + N'.' + QUOTENAME(@db) + N'.sys.sp_executesql';
EXEC @exec N'SELECT @@VERSION, DB_NAME();';

引用自:https://dba.stackexchange.com/questions/115201