Obtenga @@ SERVERNAME del servidor vinculado

8

Esta parece una pregunta básica, pero no puedo encontrar ninguna respuesta. Necesito poder obtener el nombre / instancia del servidor, etc. de un servidor vinculado. He intentado un par de cosas:

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

... pero no hay alegría. ¿Algunas ideas?

Esto es SQL 2008 R2& 2014( 2008R2es el servidor vinculado)

EDITAR: Los errores son:

Mensaje 102, Nivel 15, Estado 1, Línea 2 Sintaxis incorrecta cerca de '@@ SERVERNAME'.

dwjv
fuente

Respuestas:

8

Puede usar OPENQUERY como se explica en MSDN para obtener la información del servidor vinculado:

es decir, usando OPENQUERY ( linked_server ,'query' )

con algo como a continuación le dará el nombre del servidor 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
        ')
KASQLDBA
fuente
11

Algunos enfoques un poco más cortos (y más naturales, en mi humilde opinión):

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

O:

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

Prefiero la sp_executesqlruta porque:

  1. Todavía permitirá parámetros fuertemente tipados, en lugar de lidiar con todo tipo de concatenación de cadenas, escape de comillas simples, etc.

  2. Es fácil especificar una base de datos particular en esa ruta, en lugar de tener que poner prefijos de base de datos en todos los objetos a los que se hace referencia en la consulta. Y sí, puede definir la base de datos dinámicamente:

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

    Y el nombre del servidor vinculado, también, si es necesario:

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

Hay formas más fáciles de obtener los nombres de los servidores vinculados. Puede consultar sys.sysservers o ejecutar EXEC sp_linkedservers para proporcionarle toda la información que necesita en sus servidores locales vinculados, incluido el nombre del servidor. Aquí está el enlace en sp_linkedservers si lo desea. Si bien esto no necesariamente responde a la pregunta de cómo SELECCIONAR @@ SERVERNAME de forma remota, le brinda esa información.

Steve Mangiameli
fuente
Esto es exactamente lo que he hecho. SELECT name FROM master.sys.servers where is_linked=1Luego paso y obtengo dinámicamente todo lo que necesito.
dwjv
2
Bueno, no olvidemos que el servidor vinculado podría definirse por la dirección IP, o un alias de utilidad de red del cliente, o algo que esté enmascarado por el archivo de hosts / DNS, etc. La forma en que SQL Server se dirige a él no es necesariamente el nombre de host.
Aaron Bertrand
-2

La forma más fácil (SSMS)

No puede ejecutarlo mediante openquery si no tiene permisos en la base de datos maestra (ni debería hacerlo).

Del explorador de objetos

+ Objetos vinculados

++ Servidores vinculados

+++ [Nombre del servidor vinculado]

Haga clic con el botón izquierdo en el nombre del servidor vinculado Script Linked Server As> Create To> New Query Editor Window

Busque @ datasrc = 'fuente del servidor vinculado aquí'

Voila!

rjp
fuente