Saya telah mengalami ** ini sebelumnya, dan jika saya ingat dengan benar, untuk memastikan selalu mendapatkan hasil dengan permintaan multi-server Anda perlu memaksakan hasil kosong yang ditetapkan ketika tidak ada baris yang akan dikembalikan. Artinya, Anda memerlukan ELSE
cabang tentang itu IF
dan di dalam ELSE
Anda akan melakukan sesuatu seperti berikut:
SELECT CONVERT(DATETIME, NULL) AS [Col1name],
CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
...{additional fields}...
WHERE 1 = 0;
Ini menghasilkan set hasil kosong yang memiliki nama dan tipe data yang tepat.
ATAU, dan saya belum pernah mencoba ini di masa lalu (hanya memikirkannya saat saya mengetik ini), tetapi Anda mungkin bisa lolos dengan hanya menjeda di ELSE
cabang itu sehingga server utama / yang dimaksudkan diperbolehkan untuk selalu mengembalikan nya hasil ditetapkan pertama (yang merupakan masalah sebenarnya di sini: server pertama yang merespons menetapkan struktur yang harus dipatuhi semua tanggapan lainnya). Karenanya, berikut ini mungkin berfungsi sebagai satu-satunya hal di ELSE
:
WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)
Tapi saya tidak ingat jika server lain tidak mengembalikan hasil sama sekali menyebabkan pesan kesalahan ditampilkan di tab "Pesan". Jika itu terjadi, maka set hasil kosong pasti cara untuk pergi. Tetapi jika ini berhasil, maka ini mungkin bekerja lebih baik di template umum (seperti kasus Anda tampaknya) karena tidak perlu menyesuaikan paksa, hasil kosong yang ditetapkan setiap kali digunakan.
MEMPERBARUI:
OP memverifikasi bahwa:
- yang
WAITFOR DELAY
memang bekerja, dan
- replika melaporkan pesan kesalahan, tetapi itu tidak menimbulkan masalah untuk penggunaan OP
** Situasi yang saya temui mirip, tetapi tidak ada hubungannya dengan Grup Ketersediaan atau menginginkan hasil dari hanya satu server. Situasi kami adalah bahwa kami memiliki 18 server dengan skema yang sama dengan data yang berbeda dan perlu melakukan berbagai tugas pemeliharaan, agregasi di seluruh 18 node. Ada beberapa prosedur tersimpan yang, untuk alasan apa pun, kadang-kadang tidak mengembalikan set hasil apa pun, dan apa pun alasannya itu tidak dapat diperbaiki dalam prosedur tersimpan. Jadi, tergantung pada simpul mana yang kembali lebih dulu, sebagian besar waktu semuanya baik-baik saja, tetapi sesekali simpul yang kadang-kadang kembali tidak ada hasil yang disetel dikembalikan terlebih dahulu. Jadi, saya harus melakukan sesuatu seperti membuang hasil ke tabel temp dan jika @@ROWCOUNT
itu INSERT...EXEC
adalah 0, maka saya akan memilih paksa, kosong hasil yang ditetapkan.