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


8

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

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

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

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

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

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

回答:


8

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

つまり、 OPENQUERY ( linked_server ,'query' )

以下のようなもので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

少し短い(そしてより自然な、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();';

1

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


これはまさに私がやったことです。SELECT name FROM master.sys.servers where is_linked=1その後、ループして必要なすべてを動的に取得します。
dwjv 2015

2
リンクサーバーがIPアドレス、クライアントネットワークユーティリティのエイリアス、またはホストファイルやDNSなどによってマスクされているものによって定義されている可能性があることを忘れないでください。SQLServerがルーティングする方法は、必ずしもホスト名ではありません。
アーロンバートランド

-2

最も簡単な方法(SSMS)

masterデータベースに対するアクセス許可がない場合(または必要がない場合)、openqueryを使用してスクリプトを作成することはできません。

オブジェクトエクスプローラーから

+リンクされたオブジェクト

++リンクされたサーバー

+++ [リンクサーバー名]

リンクサーバー名を左クリック[スクリプトリンクサーバーの名前]> [作成先]> [新しいクエリエディターウィンドウ]

@ datasrc = 'ここにリンクされたサーバーソースを探します'

出来上がり!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.