Mi sono mai imbattuto in questo ** prima e, se ricordo bene, per garantire sempre di ottenere risultati con query multi-server devi forzare un set di risultati vuoto quando altrimenti non verrebbero restituite righe. Significato, hai bisogno di un ELSE
ramo su quello IF
e dentro di ELSE
te faresti qualcosa del tipo:
SELECT CONVERT(DATETIME, NULL) AS [Col1name],
CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
...{additional fields}...
WHERE 1 = 0;
Ciò produce un set di risultati vuoto con nomi e tipi di dati corretti.
OPPURE, e non ho provato questo in passato (ci ho pensato solo mentre lo stavo scrivendo), ma potresti essere in grado di cavartela semplicemente facendo una pausa in quel ELSE
ramo in modo che il server primario / previsto possa sempre restituire il suo set di risultati per primo (che è il vero problema qui: il primo server a rispondere definisce la struttura a cui devono aderire tutte le altre risposte). Quindi il seguente potrebbe funzionare come l'unica cosa in ELSE
:
WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)
Ma non ricordo se avere altri server non restituisce alcun risultato causando la visualizzazione di un messaggio di errore nella scheda "Messaggi". In tal caso, il set di risultati vuoto è sicuramente la strada da percorrere. Ma se funziona, allora potrebbe funzionare meglio in un modello generale (come il tuo caso sembra essere) in quanto non richiederebbe la regolazione del set di risultati forzato, vuoto ogni volta che viene utilizzato.
AGGIORNARE:
L'OP ha verificato che:
- l'
WAITFOR DELAY
ha realmente il loro lavoro, e
- le repliche hanno segnalato il messaggio di errore, ma non presentavano un problema per l'utilizzo del PO
** La situazione in cui mi sono imbattuto era simile, ma non aveva nulla a che fare con i gruppi di disponibilità o con i risultati desiderati da un solo server. La nostra situazione era che avevamo 18 server con lo stesso schema di dati diversi e che dovevamo svolgere varie attività di manutenzione, aggregazioni tra tutti i 18 nodi. Esistono alcune procedure memorizzate che, per qualsiasi motivo, di tanto in tanto non restituiscono alcun set di risultati e qualunque sia la ragione, non può essere risolto all'interno della procedura memorizzata. Quindi, a seconda del nodo restituito per primo, il più delle volte tutto andava bene, ma ogni tanto il nodo che a volte restituiva nessun set di risultati veniva restituito per primo. Quindi, ho dovuto fare qualcosa come scaricare i risultati in una tabella temporanea e se @@ROWCOUNT
quello INSERT...EXEC
fosse 0, avrei selezionato il set di risultati forzato e vuoto.