Dapatkan @@ SERVERNAME dari server tertaut

8

Ini sepertinya pertanyaan dasar tetapi saya tidak dapat menemukan jawaban di luar sana - saya harus bisa mendapatkan nama server / instance dll dari server yang ditautkan. Saya sudah mencoba beberapa hal:

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

... tapi tidak ada sukacita. Ada ide?

Ini adalah SQL 2008 R2& 2014( 2008R2adalah server yang ditautkan)

EDIT: Kesalahan adalah:

Msg 102, Level 15, Negara 1, Baris 2 Sintaks salah dekat '@@ SERVERNAME'.

dwjv
sumber

Jawaban:

8

Anda dapat menggunakan OPENQUERY sebagaimana dijelaskan dalam MSDN untuk mendapatkan informasi dari server Linked:

yaitu menggunakan OPENQUERY ( linked_server ,'query' )

dengan sesuatu seperti di bawah ini akan memberi Anda nama server menggunakan 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
sumber
11

Beberapa pendekatan yang sedikit lebih pendek (dan lebih alami, IMHO):

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

Atau:

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

Saya lebih suka sp_executesqlrute karena:

  1. Itu masih akan memungkinkan untuk parameter sangat diketik, daripada berurusan dengan semua jenis rangkaian string, melarikan diri dari tanda kutip tunggal, dll.

  2. Mudah untuk menentukan basis data tertentu di jalur itu, daripada harus meletakkan awalan basis data pada semua objek yang dirujuk dalam kueri. Dan ya, Anda dapat mendefinisikan basis data secara dinamis:

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

    Dan nama server yang ditautkan juga, jika perlu:

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

Ada cara yang lebih mudah untuk mendapatkan nama server dari server yang ditautkan. Anda dapat meminta sys.sysservers atau menjalankan EXEC sp_linkedservers untuk memberikan semua informasi yang Anda butuhkan pada server tertaut lokal Anda termasuk nama server. Inilah tautan di sp_linkedservers jika Anda menginginkannya. Meskipun ini tidak selalu menjawab pertanyaan tentang cara SELECT @@ SERVERNAME dari jarak jauh, ini memberi Anda informasi itu.

Steve Mangiameli
sumber
Inilah yang telah saya lakukan. SELECT name FROM master.sys.servers where is_linked=1Saya kemudian loop melalui dan secara dinamis mendapatkan semua yang saya butuhkan.
dwjv
2
Yah, jangan lupa bahwa server yang ditautkan dapat ditentukan oleh alamat IP, atau alias utilitas jaringan klien, atau sesuatu yang ditutupi oleh file host / DNS, dll. Cara rute SQL Server untuk itu belum tentu nama host.
Aaron Bertrand
-2

Cara termudah (SSMS)

Anda tidak dapat skrip melalui openquery jika Anda tidak memiliki izin pada database master (Anda juga tidak harus).

Dari objek explorer

+ Objek Tertaut

++ Server Tertaut

+++ [Nama Server Terhubung]

Klik kiri nama server yang ditautkan Script Linked Server As> Create To> New Query Editor Window

Cari @ datarc = 'sumber server tertaut di sini'

Voila!

rjp
sumber