web-dev-qa-db-fra.com

Obtenez @@ SERVERNAME à partir du serveur lié

Cela semble être une question de base, mais je ne trouve aucune réponse - j'ai besoin de pouvoir obtenir le nom/l'instance du serveur, etc. à partir d'un serveur lié. J'ai essayé deux ou trois choses:

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

... mais pas de joie. Des idées?

C'est SQL 2008 R2 & 2014 (2008R2 est le serveur lié)

EDIT: Les erreurs sont:

Msg 102, niveau 15, état 1, ligne 2 Syntaxe incorrecte près de '@@ SERVERNAME'.

8
dwjv

Vous pouvez utiliser OPENQUERYcomme expliqué dans MSDN pour obtenir les informations du serveur lié:

c'est-à-dire en utilisant OPENQUERY ( linked_server ,'query' )

avec quelque chose comme ci-dessous vous donnera le nom du serveur en utilisant sys.dm_exec_connections dmv

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
        ')
8
KASQLDBA

Quelques approches légèrement plus courtes (et plus naturelles, à mon humble avis):

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

Ou:

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

Je préfère le sp_executesql route car:

  1. Il permettra toujours des paramètres fortement typés, au lieu de traiter toutes sortes de concaténation de chaînes, d'échapper aux guillemets simples, etc.

  2. Il est facile de spécifier une base de données particulière dans ce chemin, au lieu d'avoir à mettre des préfixes de base de données sur tous les objets référencés dans la requête. Et oui, vous pouvez définir la base de données dynamiquement:

    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();';
    

    Et le nom du serveur lié, le cas échéant:

    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();';
    
11
Aaron Bertrand

Il existe des moyens plus faciles d'obtenir les noms de serveur de vos serveurs liés. Vous pouvez interroger sys.sysservers ou exécuter EXEC sp_linkedservers pour vous donner toutes les informations dont vous avez besoin sur vos serveurs liés locaux, y compris le nom du serveur. Voici le lien sur sp_linkedservers si vous le souhaitez. Bien que cela ne réponde pas nécessairement à la question de savoir comment sélectionner @@ SERVERNAME à distance, cela vous permet d'obtenir ces informations.

1
Steve Mangiameli