从链接服务器获取@@SERVERNAME

dwj*_*wjv 8 sql-server sql-server-2008-r2 linked-server openrowset exec

这似乎是一个基本问题,但我找不到任何答案 - 我需要能够从链接服务器获取服务器名称/实例等。我尝试了几件事:

select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');
Run Code Online (Sandbox Code Playgroud)

......但没有快乐。有任何想法吗?

这是SQL 2008 R2& 2014(2008R2是链接服务器)

编辑:错误是:

消息 102,级别 15,状态 1,第 2 行“@@SERVERNAME”附近的语法不正确。

Aar*_*and 11

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

EXEC LinkedServer.[master].sys.sp_executesql N'SELECT @@VERSION;';
Run Code Online (Sandbox Code Playgroud)

或者:

EXEC('SELECT @@VERSION;') AT LinkedServer;
Run Code Online (Sandbox Code Playgroud)

我更喜欢这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();';
    
    Run Code Online (Sandbox Code Playgroud)

    如果需要,链接服务器名称也是:

    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();';
    
    Run Code Online (Sandbox Code Playgroud)


KAS*_*DBA 8

您可以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
        ')
Run Code Online (Sandbox Code Playgroud)