Получить @@ SERVERNAME со связанного сервера

8

Это кажется основным вопросом, но я не могу найти никаких ответов - мне нужно иметь возможность получить имя / экземпляр сервера и т. Д. От связанного сервера. Я попробовал пару вещей:

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

... но не радость. Любые идеи?

Это SQL 2008 R2& 2014( 2008R2это связанный сервер)

РЕДАКТИРОВАТЬ: Ошибки являются:

Сообщение 102, уровень 15, состояние 1, строка 2 Неверный синтаксис рядом с @@ SERVERNAME.

dwjv
источник

Ответы:

8

Вы можете использовать, OPENQUERY как описано в MSDN, чтобы получить информацию о связанном сервере:

то есть используя OPENQUERY ( linked_server ,'query' )

с чем-то, как 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
        ')
KASQLDBA
источник
11

Некоторые чуть короче (и более естественные, ИМХО) подходы:

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

Или:

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

Я предпочитаю sp_executesqlмаршрут, потому что:

  1. Он по-прежнему допускает строго типизированные параметры, вместо того чтобы иметь дело со всеми видами конкатенации строк, экранированием одинарных кавычек и т. Д.

  2. Легко указать конкретную базу данных по этому пути, вместо того, чтобы указывать префиксы базы данных для всех объектов, на которые есть ссылки в запросе. И да, вы можете определить базу данных динамически:

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

    И имя связанного сервера тоже при необходимости может быть:

    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

Существуют более простые способы получения имен серверов связанных серверов. Вы можете запросить sys.sysservers или запустить EXEC sp_linkedservers, чтобы получить всю необходимую информацию о локальных связанных серверах, включая имя сервера. Вот ссылка на sp_linkedservers, если вы этого хотите. Хотя это не обязательно отвечает на вопрос о том, как ВЫБРАТЬ @@ SERVERNAME удаленно, вы получите эту информацию.

Стив Мангиамели
источник
Это именно то, что я сделал. SELECT name FROM master.sys.servers where is_linked=1Затем я зацикливаюсь и получаю все, что мне нужно.
августа
2
Что ж, давайте не будем забывать, что связанный сервер может быть определен по IP-адресу, или псевдониму сетевой утилиты клиента, или тому, что маскируется файлом hosts / DNS и т. Д. Способ, которым SQL Server направляет на него, не обязательно является именем хоста.
Аарон Бертран
-2

Самый простой способ (SSMS)

Вы не можете написать сценарий через openquery, если у вас нет прав доступа к базе данных master (как и вы).

От проводника объекта

+ Связанные объекты

++ Связанные серверы

+++ [Имя связанного сервера]

Щелкните левой кнопкой мыши имя связанного сервера. Сценарий Связанный сервер как> Создать в> Окно нового редактора запросов

Ищите @ datasrc = 'связанный источник сервера здесь'

Вуаля!

RJP
источник