Я пишу хранимые procs, которые вызывается устаревшей системой. Одним из ограничений устаревшей системы является то, что в едином результирующем наборе, возвращаемом из сохраненного процесса, должна быть хотя бы одна строка. Стандартом является возврат нуля в первом столбце (да, я знаю!).Добавить пустую строку для запроса результатов, если результатов не найдено
Очевидный способ достичь этого - создать временную таблицу, поместить в нее результаты, протестировать любые строки в таблице temp и либо вернуть результаты из таблицы temp, либо получить единственный пустой результат.
Другим способом может быть выполнение EXISTS против того же предложения where, которое находится в основном запросе до выполнения основного запроса.
Ни один из них не является очень приятным. Может ли кто-нибудь подумать о лучшем пути. Я думал вниз линии союзной вроде этого (я знаю, это не работает):
--create table #test
--(
-- id int identity,
-- category varchar(10)
--)
--go
--insert #test values ('A')
--insert #test values ('B')
--insert #test values ('C')
declare @category varchar(10)
set @category = 'D'
select
id, category
from #test
where category = @category
union
select
0, ''
from #test
where @@rowcount = 0
Рассмотрите принятый ответ после прочтения решения @ swe! Это так хорошо, я признаю, что я почувствовал желание высунуть вас сюда;) http: // stackoverflow.com/a/32586119/2979473 – ensisNoctis
@ensisNoctis, если я не очень ошибаюсь, это решение будет работать только в ситуациях, когда вы ожидаете либо нулевой, либо один результат назад –
К счастью, вы - позвольте мне поделиться с вами этим кодом, который в настоящее время в производстве в моей компании, все благодаря StackOverflow;) Не мог вместить все это в этот комментарий, поэтому я опубликовал другой ответ, но он все еще @ swe, только отформатирован лучше. http://stackoverflow.com/a/37046650/2979473 Он возвращает строки из нужной таблицы, если они существуют (любое число> = 1), в противном случае строки из другой таблицы (или литералы, как в моем примере). – ensisNoctis