Tester la connection des servers liés et renvoyer le (s) server (s) lié (s) connecté (s)

Je voudrais écrire un script pour tester tous les servers liés et returnner le seul qui est connecté (il y en a sûrement un seul).

Voici mon script actuel mais je suis coincé à ce moment-là:

DECLARE @retval INT DECLARE @connected INT DECLARE @name NVARCHAR(100) DECLARE @getid CURSOR SET @connected = 0 SET @getid = CURSOR FOR SELECT name as Servers FROM sys.servers OPEN @getid FETCH NEXT FROM @getid INTO @name WHILE @@FETCH_STATUS = 0 BEGIN EXEC @retval = sys.sp_testlinkedserver @name SELECT @name FETCH NEXT FROM @getid INTO @name END CLOSE @getid DEALLOCATE @getid 

Mais en utilisant cette requête, le code s'arrête à la première itération car il ne peut pas se connecter au premier server de la table. Voici le message d'erreur:

Le fournisseur OLE DB "MSDASQL" pour le server lié "server1" a renvoyé le message "Échec du lien de communication; -10709 Échec de la connection (le timeout d'attente de connection a expiré)". Msg 7303, Niveau 16, État 1, Procédure sp_testlinkedserver, Ligne 1 Impossible d'initialiser l'object de source de données du fournisseur OLE DB "MSDASQL" pour le server lié "server1".

Une idée, comment passer le message d'erreur?

Changé quelques petites choses dans ton code … donne un coup de feu.

  • IsOff signifie simplement que la connection a échoué.
  • J'ai ajouté une clause where pour ne regarder que les servers liés
  • Je n'ai jamais vu un slider en tant que variable, alors j'ai supprimé cela et les autres variables dont je n'avais pas besoin
  • Utilisé un TRY / CATCH puisque sys.sp_testlinkedserver lève et exception s'il ne réussit pas.
  • Retournez la raison pour laquelle il a échoué
  • Stocké tous les résultats dans une variable de table et seulement returnné les échecs

.

 DECLARE @name NVARCHAR(100) declare @table table (IsOff int, ServerName varchar(100), TheError varchar(4000)) DECLARE getid CURSOR FOR SELECT name FROM sys.servers where is_linked = 1 OPEN getid FETCH NEXT FROM getid INTO @name WHILE @@FETCH_STATUS = 0 BEGIN begin try exec sys.sp_testlinkedserver @name end try begin catch insert into @table values (1,@name,ERROR_MESSAGE()) end catch FETCH NEXT FROM getid INTO @name END CLOSE getid DEALLOCATE getid select ServerName, TheError from @table where IsOff = 1 

Voici le code final de ma question:

 DECLARE @name NVARCHAR(100) declare @table table (IsOff int, ServerName varchar(100), TheError varchar(4000)) DECLARE getid CURSOR FOR SELECT name FROM sys.servers where is_linked = 1 AND product = 'HANA' AND [catalog] = 'HP5' OPEN getid FETCH NEXT FROM getid INTO @name WHILE @@FETCH_STATUS = 0 BEGIN begin try exec sys.sp_testlinkedserver @name insert into @table values (1,@name,'Server is Connected') end try begin catch insert into @table values (0,@name,ERROR_MESSAGE()) end catch FETCH NEXT FROM getid INTO @name END CLOSE getid DEALLOCATE getid select * from @table where IsOff = 1