J'ai déjà rencontré ce ** avant, et si je me souviens bien, pour vous assurer d'obtenir toujours des résultats avec des requêtes multi-serveurs, vous devez forcer un ensemble de résultats vide lorsqu'aucune ligne ne serait retournée autrement. ELSE
Cela signifie que vous avez besoin d'une branche à ce sujet IF
et que ELSE
vous feriez quelque chose comme ceci:
SELECT CONVERT(DATETIME, NULL) AS [Col1name],
CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
...{additional fields}...
WHERE 1 = 0;
Cela produit un jeu de résultats vide qui a les noms et les types de données appropriés.
OU, et je n'ai pas essayé cela dans le passé (je l'ai juste pensé en tapant ceci), mais vous pourriez peut- être vous en sortir simplement en faisant une pause dans cette ELSE
branche de telle sorte que le serveur principal / prévu soit toujours autorisé à renvoyer son résultat défini en premier (ce qui est le vrai problème ici: le premier serveur à répondre définit la structure à laquelle toutes les autres réponses doivent adhérer). Par conséquent, ce qui suit pourrait fonctionner comme la seule chose dans le ELSE
:
WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)
Mais je ne me souviens pas si le fait que d'autres serveurs ne retournent aucun résultat provoquait l'affichage d'un message d'erreur dans l'onglet "Messages". Si cela se produit, le jeu de résultats vide est définitivement la voie à suivre. Mais si cela fonctionne, cela pourrait mieux fonctionner dans un modèle général (comme votre cas semble l'être) car cela ne nécessiterait pas d'ajuster le jeu de résultats forcé et vide chaque fois qu'il est utilisé.
MISE À JOUR:
Le PO a vérifié que:
- l'
WAITFOR DELAY
avez fait travailler, et
- les répliques ont signalé le message d'erreur, mais cela n'a pas posé de problème pour l'utilisation de l'OP
** La situation que j'ai rencontrée était similaire, mais n'avait rien à voir avec les groupes de disponibilité ou le fait de vouloir des résultats provenant d'un seul serveur. Notre situation était que nous avions 18 serveurs de données de schéma différent et que nous devions effectuer diverses tâches de maintenance, agrégations sur les 18 nœuds. Il y avait des procédures stockées qui, pour une raison quelconque, ne retournaient parfois aucun ensemble de résultats, et quelle que soit la raison, il ne pouvait pas être corrigé dans la procédure stockée. Ainsi, en fonction du nœud renvoyé en premier, la plupart du temps tout allait bien, mais de temps en temps le nœud qui ne renvoyait parfois aucun jeu de résultats revenait en premier. Donc, je devais faire quelque chose comme vider les résultats dans une table temporaire et si @@ROWCOUNT
cela INSERT...EXEC
était 0, alors je choisirais le résultat forcé, ensemble vide.