web-dev-qa-db-ja.com

リンクサーバーを使用してリモートでストアドプロシージャを実行する

3つのSQL Server 2012インスタンスがありますが、そのうちの2つはdb_ownerではありません。一部のストアドプロシージャは、DMVおよびsysビューと、ローカルで実行した場合にのみ機能するストアドプロシージャを使用しています。

これらの(私たちの)ストアドプロシージャの実行をメインインスタンスに集中化し、そこからこれらのストアドプロシージャをリモートで実行したいと思います。 SQL Serverエージェントのジョブを使用してみましたが、実行に慣れていない構成が必要で、おそらくアクセスできません。

リンクサーバーを使用して、ストアドプロシージャをリモートで実行する方法はありますか?

編集:リンクサーバーopenrowset、シンプルなSQL内で実行できるものなら何でも使用できます。 SSISを使用しないでください。使用すると、プロセスの一部が単純なSQLから分離され、それを実行するには複数のプラットフォームが必要になります。

10
Hikari

プロシージャがリモートサーバー上にあると仮定します。EXECUTEATコマンドを使用してみましたか?

DECLARE @RunStoredProcSQL VARCHAR(1000);
SET @RunStoredProcSQL = 'EXEC [Database].[dbo].[StoredProcName]';
--SELECT @RunStoredProcSQL --Debug
EXEC (@RunStoredProcSQL) AT [LinkedServerName];
Print 'Procedure Executed';

それは私が過去にうまく使用したものです。私は通常、念のため、declare/execをtry catchで囲みますが、現在私のシステムでは1時間ごとに動作しています。

16
MguerraTorres

SSISの仕事のように聞こえます。 SSISパッケージをセットアップし、Execute SQL Taskストアドプロシージャを実行します。その後、エージェントジョブを介してSSISパッケージを実行できます。

1
Arthur D

「リンクサーバーでプロシージャを実行」を検索すると、このスレッドが見つかりました。しかし、私の要件は、複数のサーバーで利用できる同じ手順を実行することであり、私はあなたや他のユーザーを助けることができる以下を思いついた:

より簡単な方法で質問に答えるには、4つの部分からなる名前を使用してリモートクエリを実行します:Exec ('linkedservername.DBName.dbo.ProcedureName') ;

次のクエリを使用して、中央サーバー(このスクリプトの実行元)で使用可能な複数のリンクサーバーを対象とするリンクサーバー(1つに限定されない)でプロシージャを実行できます。

 Declare @TargetServers table (LinkedServer nvarchar(50));
 Declare @LinkedServer  varchar(50);

 Insert into @TargetServers 
 select [data_source] from sys.servers where is_linked = 1 and [Provider] = 'SQLNCLI';

 While exists (select * from @TargetServers) 
     begin
         set @LinkedServer = (select top 1 name from sys.servers where is_linked = 1);

         Exec ('['+@LinkedServer + '].DBAClient.dbo.ProcessUnusedIndexInfo') ;
         if @@ERROR = 0
         delete from @TargetServers where LinkedServer = @LinkedServer;
     end
0
Shekar Kola