Nhận @@ SERVERNAME từ máy chủ được liên kết


8

Đây có vẻ như là một câu hỏi cơ bản nhưng tôi không thể tìm thấy bất kỳ câu trả lời nào ngoài đó - tôi cần có thể lấy tên / ví dụ máy chủ, vv từ một máy chủ được liên kết. Tôi đã thử một vài điều:

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

... nhưng không có niềm vui. Có ý kiến ​​gì không?

Đây là SQL 2008 R2& 2014( 2008R2là máy chủ được liên kết)

EDIT: Lỗi là:

Msg 102, Cấp 15, Trạng thái 1, Dòng 2 Cú pháp không chính xác gần '@@ SERVERNAME'.

Câu trả lời:


8

Bạn có thể sử dụng OPENQUERY như được giải thích trong MSDN để lấy thông tin của Máy chủ được liên kết:

tức là sử dụng OPENQUERY ( linked_server ,'query' )

với một cái gì đó như dưới đây sẽ cung cấp cho bạn tên máy chủ bằng cách sử dụng 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

Một số cách tiếp cận ngắn hơn (và tự nhiên hơn, IMHO):

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

Hoặc là:

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

Tôi thích sp_executesqltuyến đường vì:

  1. Nó vẫn sẽ cho phép các tham số được gõ mạnh, thay vì xử lý tất cả các loại nối chuỗi, thoát các dấu ngoặc đơn, v.v.

  2. Thật dễ dàng để chỉ định một cơ sở dữ liệu cụ thể trong đường dẫn đó, thay vì phải đặt tiền tố cơ sở dữ liệu trên tất cả các đối tượng được tham chiếu trong truy vấn. Và có, bạn có thể xác định cơ sở dữ liệu một cách linh hoạt:

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

    Và tên máy chủ được liên kết cũng vậy, nếu cần là:

    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

Có nhiều cách dễ dàng hơn để lấy tên máy chủ của các máy chủ được liên kết của bạn. Bạn có thể truy vấn sys.sysservers hoặc chạy EXEC sp_linkedservers để cung cấp cho bạn tất cả thông tin bạn cần trên các máy chủ được liên kết cục bộ bao gồm tên máy chủ. Đây là liên kết trên sp_linkedservers nếu bạn muốn. Mặc dù điều này không nhất thiết phải trả lời câu hỏi về cách CHỌN @@ SERVERNAME từ xa, nhưng nó sẽ cung cấp cho bạn thông tin đó.


Đây chính xác là những gì tôi đã làm. SELECT name FROM master.sys.servers where is_linked=1Sau đó tôi lặp lại và tự động lấy mọi thứ tôi cần.
dwjv

2
Chà, đừng quên rằng máy chủ được liên kết có thể được xác định bởi địa chỉ IP hoặc bí danh tiện ích mạng máy khách hoặc thứ gì đó bị che bởi tệp máy chủ / DNS, v.v. Cách SQL Server định tuyến đến nó không nhất thiết phải là tên máy chủ.
Aaron Bertrand

-2

Cách dễ nhất (SSMS)

Bạn không thể tạo kịch bản thông qua openquery nếu bạn không có quyền trên cơ sở dữ liệu chính (bạn cũng không nên).

Từ thám hiểm đối tượng

+ Đối tượng được liên kết

++ Máy chủ được liên kết

+++ [Tên máy chủ được liên kết]

Nhấp chuột trái vào tên máy chủ được liên kết Tập lệnh Máy chủ được liên kết dưới dạng> Tạo thành> Cửa sổ Trình soạn thảo truy vấn mới

Tìm kiếm @ datarc = 'nguồn máy chủ được liên kết tại đây'

Voila!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.