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

10

Wir haben 3 SQL Server 2012-Instanzen, 2 davon sind wir nicht db_owner. Einige unserer gespeicherten Prozeduren verwenden DMV und sysAnsichten 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 Verbindungsserver verwenden, openrowsetalles, 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.

Hikari
quelle

Antworten:

16

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 stündlich auf meinen Systemen.

MguerraTorres
quelle
Ihre Lösung ist perfekt und die einzige, die ich gefunden habe, funktioniert. Dies ist jedoch äußerst chaotisch und Microsoft sollte sich schämen, dass dies der richtige Weg ist, dies zu tun.
Flat Cat
1
Hahaha danke @FlatCat! Ehrlich gesagt bin ich nicht anderer Meinung als Sie. Der Grund, warum ich diese Methode verwendet habe, als ich sie zum ersten Mal entdeckte, war, dass ich PII-Daten von einem Server (Express) löschen wollte, der keinen SQL Agent hatte. Ich wollte auch nicht, dass der Planungsserver einen Einblick in die Daten oder Prozeduren hat, also hat dies geklappt.
MguerraTorres
1

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

Arthur D.
quelle
Ja, ich möchte kein SSIS verwenden. Verwenden Sie nur einfaches SQL.
Hikari
1
Sie sollten dann in der Lage sein, einen Verbindungsserver mit Berechtigungen zum Ausführen der gespeicherten Prozeduren zu erstellen. Stellen Sie einfach sicher, dass das Konto, mit dem Sie es erstellen, über Berechtigungen zum Ausführen auf dem Zielserver verfügt.
Arthur D
0

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