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.
.
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