it-swarm.com.de

Führen Sie die gespeicherte Prozedur remote über den Verbindungsserver aus

Wir haben 3 SQL Server 2012-Instanzen, 2 davon sind wir nicht db_owner. Einige unserer gespeicherten Prozeduren verwenden DMV- und sys Ansichten und gespeicherte Prozeduren, die nur funktionieren, wenn sie lokal ausgeführt werden.

Ich möchte die Ausführung dieser (unserer) gespeicherten Prozeduren in unserer Hauptinstanz zentralisieren und von dort aus diese gespeicherten Prozeduren remote ausführen. Ich habe versucht, SQL Server Agent-Jobs zu verwenden, aber es erfordert eine Konfiguration, die ich nicht gerne mache und wahrscheinlich sowieso keinen Zugriff habe.

Gibt es eine Möglichkeit, eine gespeicherte Prozedur remote auszuführen, vorzugsweise über einen Verbindungsserver?

Bearbeiten: Wir können den Verbindungsserver openrowset verwenden, alles, was in einfachem SQL ausgeführt werden kann. Ich würde SSIS lieber nicht verwenden, da dies einen Teil des Prozesses von einfachem SQL trennen und mehrere Plattformen erfordern würde, um ihn auszuführen.

10
Hikari

Angenommen, die Prozedur befindet sich auf dem Remote-Server: Haben Sie versucht, den Befehl EXECUTE AT] zu verwenden?

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

Das habe ich in der Vergangenheit erfolgreich eingesetzt. Normalerweise umgib ich das Deklarieren/Ausführen für alle Fälle mit einem Try-Catch, aber es funktioniert derzeit jede Stunde auf meinen Systemen.

16
MguerraTorres

Klingt nach einem Job für SSIS. Richten Sie ein SSIS-Paket ein und verwenden Sie Execute SQL Task, um Ihre gespeicherten Prozeduren auszuführen. Sie können die SSIS-Pakete dann über Agent-Jobs ausführen.

1
Arthur D

Ich habe diesen Thread bei der Suche nach "Prozedur auf Verbindungsserver ausführen" gefunden. Meine Anforderung besteht jedoch darin, dasselbe Verfahren auszuführen, das auf mehreren Servern verfügbar ist, und ich habe Folgendes entwickelt, das Ihnen oder anderen Benutzern helfen kann:

Um Ihre Frage einfacher zu beantworten: Verwenden Sie den 4-teiligen Namen, um die Remote-Abfrage auszuführen: Exec ('linkedservername.DBName.dbo.ProcedureName') ;

Die folgende Abfrage kann verwendet werden, um eine Prozedur auf einem Verbindungsserver (nicht auf einen beschränkt) auszuführen, die auf mehrere Verbindungsserver abzielt, die auf dem zentralen Server verfügbar sind (von dem aus dieses Skript ausgeführt wird):

 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 ('['[email protected] + '].DBAClient.dbo.ProcessUnusedIndexInfo') ;
         if @@ERROR = 0
         delete from @TargetServers where LinkedServer = @LinkedServer;
     end
0
Shekar Kola