Obtenez @@ SERVERNAME à partir du serveur lié

8

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?

Ceci est SQL 2008 R2& 2014( 2008R2est le serveur lié)

EDIT: Les erreurs sont:

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

dwjv
la source

Réponses:

8

Vous pouvez utiliser OPENQUERY comme 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_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
        ')
KASQLDBA
la source
11

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 l' sp_executesqlitinéraire 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();';
Aaron Bertrand
la source
1

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.

Steve Mangiameli
la source
C'est exactement ce que j'ai fait. SELECT name FROM master.sys.servers where is_linked=1Je passe ensuite en revue et obtiens dynamiquement tout ce dont j'ai besoin.
dwjv
2
Eh bien, n'oublions pas que le serveur lié peut être défini par l'adresse IP, ou un alias d'utilitaire de réseau client, ou quelque chose qui est masqué par le fichier / DNS d'hôtes, etc. La façon dont SQL Server l'achemine n'est pas nécessairement le nom d'hôte.
Aaron Bertrand
-2

Moyen le plus simple (SSMS)

Vous ne pouvez pas l'écrire via openquery si vous n'avez pas d'autorisations sur la base de données master (vous ne devriez pas non plus).

Depuis l'explorateur d'objets

+ Objets liés

++ Serveurs liés

+++ [Nom du serveur lié]

Cliquez avec le bouton gauche sur le nom du serveur lié Script Linked Server As> Créer vers> Nouvelle fenêtre de l'éditeur de requête

Recherchez @ datasrc = 'source de serveur liée ici'

Voila!

rjp
la source