Obtenha @@ SERVERNAME do servidor vinculado

8

Esta parece ser uma pergunta básica, mas não consigo encontrar respostas - preciso obter o nome / instância do servidor etc. de um servidor vinculado. Eu tentei algumas coisas:

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

... mas sem alegria. Alguma ideia?

Este é SQL 2008 R2& 2014( 2008R2é o servidor vinculado)

EDIT: Os erros são:

Mensagem 102, Nível 15, Estado 1, Linha 2 Sintaxe incorreta perto de '@@ SERVERNAME'.

dwjv
fonte

Respostas:

8

Você pode usar OPENQUERY como explicado no MSDN para obter as informações do servidor vinculado:

ou seja, usando OPENQUERY ( linked_server ,'query' )

com algo como abaixo lhe dará o nome do 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
fonte
11

Algumas abordagens ligeiramente mais curtas (e mais naturais, IMHO):

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

Ou:

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

Eu prefiro a sp_executesqlrota porque:

  1. Ele ainda permitirá parâmetros fortemente tipados, em vez de lidar com todos os tipos de concatenação de strings, escape de aspas simples, etc.

  2. É fácil especificar um banco de dados específico nesse caminho, em vez de precisar colocar prefixos de banco de dados em todos os objetos referenciados na consulta. E sim, você pode definir o banco de dados dinamicamente:

    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 o nome do servidor vinculado também, se necessário:

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

Existem maneiras mais fáceis de obter os nomes dos servidores vinculados. Você pode consultar o sys.sysservers ou executar o EXEC sp_linkedservers para fornecer todas as informações necessárias nos servidores vinculados locais, incluindo o nome do servidor. Aqui está o link em sp_linkedservers, se você quiser. Embora isso não responda necessariamente à pergunta de como SELECT @@ SERVERNAME remotamente, você obtém essas informações.

Steve Mangiameli
fonte
Isto é exatamente o que eu fiz. SELECT name FROM master.sys.servers where is_linked=1Depois, percorro e obtenho dinamicamente tudo o que preciso.
dwjv
2
Bem, não vamos esquecer que o servidor vinculado pode ser definido pelo endereço IP, ou um alias do utilitário de rede do cliente ou algo mascarado pelo arquivo hosts / DNS etc. A maneira como o SQL Server roteia para ele não é necessariamente o nome do host.
Aaron Bertrand
-2

Maneira mais fácil (SSMS)

Você não pode criar scripts através do openquery se não tiver permissões no banco de dados mestre (nem deveria).

Do explorador de objetos

+ Objetos vinculados

++ Servidores vinculados

+++ [Nome do servidor vinculado]

Clique com o botão esquerdo do mouse no nome do servidor vinculado Script Servidor Vinculado como> Criar para> Janela Novo Editor de Consultas

Procure @ datasrc = 'fonte do servidor vinculada aqui'

Voila!

rjp
fonte