web-dev-qa-db-fra.com

Exécuter une procédure stockée à distance à l'aide d'un serveur lié

Nous avons 3 instances SQL Server 2012, 2 d'entre elles ne sont pas db_owner. Certaines de nos procédures stockées utilisent des vues DMV et sys et des procédures stockées qui ne fonctionnent que lorsqu'elles sont exécutées localement.

Je voudrais centraliser l'exécution de ces (nos) procédures stockées dans notre instance principale, et à partir de là, exécuter ces procédures stockées à distance. J'ai essayé d'utiliser les travaux de l'Agent SQL Server, mais cela nécessite une configuration que je ne suis pas à l'aise de faire et n'aurai probablement pas accès de toute façon.

Existe-t-il un moyen d'exécuter à distance une procédure stockée, de préférence en utilisant un serveur lié?

Edit: nous pouvons utiliser le serveur lié, openrowset, tout ce qui peut être exécuté à l'intérieur de SQL simple. Je préfère ne pas utiliser SSIS, car cela séparerait une partie du processus du simple SQL et nécessiterait plusieurs plates-formes pour l'exécuter.

10
Hikari

En supposant que la procédure se trouve sur le serveur distant: avez-vous essayé d'utiliser la commande EXECUTE AT?

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

C'est ce que j'ai utilisé avec succès dans le passé. J'entoure généralement le declare/exec dans un catch catch juste au cas où, mais il fonctionne actuellement sur mes systèmes toutes les heures.

16
MguerraTorres

Cela ressemble à un travail pour SSIS. Configurez un package SSIS et utilisez le Execute SQL Task pour exécuter vos procédures stockées. Vous pouvez ensuite exécuter les packages SSIS via des travaux d'agent.

1
Arthur D

J'ai trouvé ce fil lors de la recherche de "exécuter la procédure sur le serveur lié". mais mon exigence est d'exécuter la même procédure qui est disponible sur plusieurs serveurs, et j'ai trouvé la suite qui peut vous aider, vous ou d'autres utilisateurs:

Pour répondre à votre question de manière plus simple: utiliser un nom en 4 parties pour exécuter une requête distante: Exec ('linkedservername.DBName.dbo.ProcedureName') ;

La requête suivante peut être utilisée pour exécuter la procédure sur le serveur lié (non limité à un) ciblant plusieurs serveurs liés disponibles sur le serveur central (d'où ce script s'exécute):

 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