Ottieni @@ SERVERNAME dal server collegato


8

Sembra una domanda di base ma non riesco a trovare alcuna risposta là fuori: devo essere in grado di ottenere il nome del server / istanza ecc. Da un server collegato. Ho provato un paio di cose:

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

... ma nessuna gioia. Qualche idea?

Questo è SQL 2008 R2& 2014( 2008R2è il server collegato)

EDIT: gli errori sono:

Messaggio 102, livello 15, stato 1, riga 2 Sintassi errata vicino a "@@ SERVERNAME".

Risposte:


8

È possibile utilizzare OPENQUERY come spiegato in MSDN per ottenere le informazioni del server collegato:

cioè usando OPENQUERY ( linked_server ,'query' )

con qualcosa come sotto ti darà il nome del server usando 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
        ')

11

Alcuni approcci leggermente più brevi (e più naturali, IMHO):

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

O:

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

Preferisco il sp_executesqlpercorso perché:

  1. Consentirà comunque parametri fortemente tipizzati, invece di trattare tutti i tipi di concatenazione di stringhe, l'escaping di virgolette singole, ecc.

  2. È facile specificare un determinato database in quel percorso, invece di dover mettere i prefissi del database su tutti gli oggetti a cui fa riferimento la query. E sì, è possibile definire dinamicamente il database:

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

    E anche il nome del server collegato, se necessario, è:

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

1

Esistono modi più semplici per accedere ai nomi dei server dei server collegati. È possibile eseguire una query su sys.sysservers o eseguire EX_ sp_linkedservers per fornire tutte le informazioni necessarie sui server collegati locali, incluso il nome del server. Ecco il link su sp_linkedservers se lo desideri. Sebbene ciò non risponda necessariamente alla domanda su come SELEZIONARE @@ SERVERNAME in remoto, ti fornisce queste informazioni.


Questo è esattamente quello che ho fatto. SELECT name FROM master.sys.servers where is_linked=1Quindi eseguo il loop e ottengo dinamicamente tutto ciò di cui ho bisogno.
dwjv,

2
Bene, non dimentichiamo che il server collegato potrebbe essere definito dall'indirizzo IP, o da un alias dell'utilità di rete client, o da qualcosa che è mascherato dal file hosts / DNS, ecc. Il modo in cui SQL Server viene indirizzato ad esso non è necessariamente il nome host.
Aaron Bertrand

-2

Il modo più semplice (SSMS)

Non puoi copiarlo tramite openquery se non disponi delle autorizzazioni per il database principale (né dovresti farlo).

Dall'esploratore oggetti

+ Oggetti collegati

++ Server collegati

+++ [Nome server collegato]

Fare clic con il tasto sinistro del mouse sul nome del server collegato Script Server collegato come> Crea in> Nuova finestra dell'editor di query

Cerca @ datasrc = 'origine del server collegato qui'

Ecco!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.