これは基本的な質問のようですが、答えは見つかりません-リンクサーバーからサーバー名/インスタンスなどを取得できるようにする必要があります。私はいくつかのことを試しました:
select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');
...しかし喜びはない。何か案は?
これは SQL 2008 R2
&2014
(2008R2
はリンクサーバーです)
編集:エラーは次のとおりです。
メッセージ102、レベル15、状態1、行2 '@@ SERVERNAME'付近の構文が正しくありません。
OPENQUERY
MSDNで説明されているように を使用して、リンクサーバーの情報を取得できます。
つまり、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
')
少し短い(そしてより自然なIMHO)アプローチ:
EXEC LinkedServer.[master].sys.sp_executesql N'SELECT @@VERSION;';
または:
EXEC('SELECT @@VERSION;') AT LinkedServer;
sp_executesql
ルートの理由:
それでも、すべての種類の文字列連結、単一引用符のエスケープなどを処理する代わりに、厳密に型指定されたパラメーターを使用できます。
クエリで参照されるすべてのオブジェクトにデータベースプレフィックスを付ける必要がなく、そのパスで特定のデータベースを指定するのは簡単です。そして、はい、データベースを動的に定義できます:
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();';
リンクサーバーのサーバー名を取得する簡単な方法があります。 sys.sysserversにクエリを実行するか、EXEC sp_linkedserversを実行して、サーバー名を含むローカルリンクサーバーで必要なすべての情報を取得できます。必要に応じて、sp_linkedserversの link を以下に示します。これは必ずしも@@ SERVERNAMEをリモートで選択する方法の質問に答えるものではありませんが、その情報を取得します。