Вы можете использовать выражение CASE
вместо прямой переменной @take
:
SELECT
*
FROM Properties
-- Some conditions and joins are here using other parameters
-- A big Order by with cases is placed here
OFFSET @skip ROWS
FETCH NEXT CASE WHEN @take > 0 THEN @take ELSE 1000001 END ROWS ONLY;
Конечно, для этого нужно выбрать «достаточно большую» константу для ELSE
это больше, чем любой разумный набор результатов, который вы ожидаете, что ваш запрос вернет.Обычно я выбираю округленное число и добавляю его, имея в виду, что я буду отображать результаты с «круглым числом», и если я получу этот дополнительный результат, я могу хотя бы включить индикатор того, что запрос дал еще больше результатов, чем этот.
Это основано на предположении, что пользователь контролирует фильтрацию, и вы хотите / можете сказать: «Вы знаете, что результатов слишком много. Используйте функцию подкачки, если вы действительно хотите работатьчерез все из них, но я не буду пытаться показать их все вам сейчас ".
Мне также придется улучшить приведенный выше код, чтобы позволить SP получать параметруказание, должно ли оно «группироваться по» некоторому полю
Это более хитрое предложение.Запрос с предложением GROUP BY
обязательно влечет за собой предложение SELECT
, которое содержит столбцы, охватываемые предложением GROUP BY
или агрегатными выражениями .(а если нет агрегатов, какой смысл в группировке?).Это принципиально отличается от запроса, не относящегося к группировке, поэтому вы не можете переключаться между ними с помощью простого переключателя / флага.
В этот момент запросы вряд ли будут иметь большое сходство (за исключением, возможно, FROM
предложение о том, что вы, возможно, захотите перейти в представление или табличную функцию для повторного использования) или вам потребуется переключиться на динамический SQL.