Я сталкивался с этим ** раньше, и, если я правильно помню, чтобы всегда получать результаты с многосерверными запросами, вам нужно принудительно установить пустой набор результатов, если в противном случае строки не были бы возвращены. Это значит, что вам нужна ELSE
ветка, IF
и внутри ELSE
вы бы сделали что-то вроде следующего:
SELECT CONVERT(DATETIME, NULL) AS [Col1name],
CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
...{additional fields}...
WHERE 1 = 0;
Это приводит к пустому набору результатов с правильными именами и типами данных.
ИЛИ, и я не пробовал это в прошлом (просто подумал об этом, когда я набирал это), но вы могли бы сойти с рук с простой паузой в этой ELSE
ветви, так что основной / предполагаемый сервер всегда может вернуть свой сначала набор результатов (что является настоящей проблемой: первый отвечающий сервер определяет структуру, которой должны придерживаться все остальные ответы). Следовательно, следующее может работать как единственное в ELSE
:
WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)
Но я не помню, чтобы другие серверы вообще ничего не возвращали, что вызвало сообщение об ошибке на вкладке «Сообщения». Если это произойдет, то пустой набор результатов определенно поможет. Но если это сработает, то это может работать лучше в общем шаблоне (как кажется в вашем случае), так как для этого не потребуется корректировать принудительный пустой набор результатов при каждом его использовании.
ОБНОВИТЬ:
ФП проверил, что:
WAITFOR DELAY
действительно работает, и
- реплики действительно сообщали об ошибке, но это не представляло проблемы для использования OP
** Ситуация, с которой я столкнулся, была похожей, но не имела ничего общего ни с группами доступности, ни с желанием получить результаты только с одного сервера. Наша ситуация состояла в том, что у нас было 18 серверов одной и той же схемы с разными данными, и нам нужно было выполнять различные задачи по обслуживанию, объединяя все 18 узлов. Существовали некоторые хранимые процедуры, которые по какой-то причине иногда не возвращали какой-либо набор результатов, и какова бы ни была эта причина, она не могла быть исправлена в хранимой процедуре. Таким образом, в зависимости от того, какой узел возвратился первым, большую часть времени все было в порядке, но время от времени узел, который иногда не возвращал набор результатов, возвращал первым. Итак, мне нужно было сделать что-то вроде вывода результатов во временную таблицу, и если бы @@ROWCOUNT
это INSERT...EXEC
было 0, я бы выбрал принудительный пустой набор результатов.