Holen Sie sich @@ SERVERNAME vom Verbindungsserver

8

Dies scheint eine grundlegende Frage zu sein, aber ich kann dort keine Antworten finden - ich muss in der Lage sein, den Servernamen / die Instanz usw. von einem Verbindungsserver abzurufen. Ich habe ein paar Dinge ausprobiert:

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

... aber keine Freude. Irgendwelche Ideen?

Dies ist SQL 2008 R2& 2014( 2008R2ist der Verbindungsserver)

EDIT: Fehler sind:

Meldung 102, Ebene 15, Status 1, Zeile 2 Falsche Syntax in der Nähe von '@@ SERVERNAME'.

dwjv
quelle

Antworten:

8

Sie können OPENQUERY wie in MSDN erläutert verwenden , um die Informationen des Verbindungsservers abzurufen:

dh mit OPENQUERY ( linked_server ,'query' )

Mit so etwas wie unten erhalten Sie den Servernamen mit 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
quelle
11

Einige etwas kürzere (und natürlichere, IMHO) Ansätze:

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

Oder:

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

Ich bevorzuge die sp_executesqlRoute, weil:

  1. Es werden weiterhin stark typisierte Parameter zugelassen, anstatt sich mit allen Arten der Verkettung von Zeichenfolgen, dem Entkommen einfacher Anführungszeichen usw. zu befassen.

  2. Es ist einfach, eine bestimmte Datenbank in diesem Pfad anzugeben, anstatt Datenbankpräfixe für alle Objekte setzen zu müssen, auf die in der Abfrage verwiesen wird. Und ja, Sie können die Datenbank dynamisch definieren:

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

    Und der Name des Verbindungsservers, falls erforderlich:

    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
quelle
1

Es gibt einfachere Möglichkeiten, die Servernamen Ihrer Verbindungsserver abzurufen. Sie können sys.sysservers abfragen oder EXEC sp_linkedservers ausführen, um alle Informationen zu Ihren lokalen Verbindungsservern einschließlich des Servernamens zu erhalten. Hier ist der Link auf sp_linkedservers, wenn Sie es wollen. Dies beantwortet zwar nicht unbedingt die Frage, wie Sie @@ SERVERNAME remote auswählen können, aber Sie erhalten diese Informationen.

Steve Mangiameli
quelle
Genau das habe ich getan. SELECT name FROM master.sys.servers where is_linked=1Ich durchlaufe dann und bekomme dynamisch alles, was ich brauche.
Dwjv
2
Vergessen wir nicht, dass der Verbindungsserver durch die IP-Adresse oder einen Alias ​​des Client-Netzwerkdienstprogramms oder durch eine Hosts-Datei / DNS usw. maskiert sein kann. Die Art und Weise, wie SQL Server zu ihm weiterleitet, ist nicht unbedingt der Hostname.
Aaron Bertrand
-2

Einfachster Weg (SSMS)

Sie können es nicht über openquery skripten, wenn Sie keine Berechtigungen für die Master-Datenbank haben (und sollten dies auch nicht tun).

Aus dem Objekt-Explorer

+ Verknüpfte Objekte

++ Verbindungsserver

+++ [Name des Verbindungsservers]

Klicken Sie mit der linken Maustaste auf den Namen des Verbindungsservers. Skript Verbindungsserver als> Erstellen an> Neues Abfrageeditorfenster

Suchen Sie hier nach @ datasrc = 'Verbindungsserverquelle'

Voila!

rjp
quelle