TSQL: динамическое значение для TOP - PullRequest
3 голосов
/ 28 октября 2011

Мне нужно разрешить пользователям запрашивать все или некоторые записи. Прямо сейчас я делаю это:

DECLARE @Limit INT = NULL

IF @Limit IS NULL SELECT @Limit = COUNT(ID) FROM vwNotifications

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title
FROM vwNotifications

Есть ли способ сделать это без использования запроса COUNT?

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

у вас есть два варианта

1 сделать топ-2 миллиарда, если это 0 но опять же ... вы действительно хотите вернуть 2 миллиарда строк за 1 выстрел?

DECLARE @Limit INT = NULL

SELECT @Limit = COALESCE(@Limit, 200000000)

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title
FROM vwNotifications

или сделайте если еще

DECLARE @Limit INT = NULL

IF @Limit IS NULL

SELECT  ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title
FROM vwNotifications

else

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title
FROM vwNotifications
3 голосов
/ 28 октября 2011

Предполагая, что ваша таблица никогда не будет содержать больше строк, чем поддерживается целым числом (т.е. первичный ключ - int, а не bigint, что на практике вероятно):

DECLARE @Limit INT = NULL 

IF @Limit IS NULL OR @Limit = 0
   SET @Limit = 2147483647  -- Max Int

SELECT TOP (@Limit) ROW_NUMBER() OVER(ORDER BY Type, CreatedBy DESC) AS Row, Title 
FROM vwNotifications 

Другой вариант - оператор if и два запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...