web-dev-qa-db-ja.com

リンクサーバーから@@ SERVERNAMEを取得する

これは基本的な質問のようですが、答えは見つかりません-リンクサーバーからサーバー名/インスタンスなどを取得できるようにする必要があります。私はいくつかのことを試しました:

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

...しかし喜びはない。何か案は?

これは SQL 2008 R220142008R2はリンクサーバーです)

編集:エラーは次のとおりです。

メッセージ102、レベル15、状態1、行2 '@@ SERVERNAME'付近の構文が正しくありません。

8
dwjv

OPENQUERYMSDNで説明されているように を使用して、リンクサーバーの情報を取得できます。

つまり、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
        ')
8
KASQLDBA

少し短い(そしてより自然なIMHO)アプローチ:

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

リンクサーバーのサーバー名を取得する簡単な方法があります。 sys.sysserversにクエリを実行するか、EXEC sp_linkedserversを実行して、サーバー名を含むローカルリンクサーバーで必要なすべての情報を取得できます。必要に応じて、sp_linkedserversの link を以下に示します。これは必ずしも@@ SERVERNAMEをリモートで選択する方法の質問に答えるものではありませんが、その情報を取得します。

1