WAITFOR(RECEIVE), TIMEOUT
работает, фактически запуская RECEIVE хотя бы один раз. Если результирующий набор пуст, он продолжает ждать. Каждый раз, когда он полагает, что это может быть успешным (он получает внутреннее уведомление о наличии большего количества сообщений), он снова запускает RECEIVE. Повторяйте в цикле, пока он не вернет строки или не истечет время ожидания.
Но тайм-аут не прерывает получение, уже выполняемое в этом цикле. Если для RECEIVE требуется много времени, чтобы найти сообщения в очереди (это может произойти с большими очередями или с плохими планами выполнения для RECEIVE), тайм-аут не может быть соблюден. Обратите внимание, что это может иметь место даже в том случае, если RECEIVE не находит какое-либо сообщение, поскольку очередь может содержать большое количество сообщений, которые все заблокированы (точнее, все принадлежащие заблокированным группам разговоров). В этом случае выполнение RECEIVE может занять много времени, поиск разблокированных групп разговоров и, в конце концов, все равно приходит с пустыми руками.