Динамический TOP N / TOP 100 PERCENT в одном запросе на основе условия - PullRequest
0 голосов
/ 12 октября 2018

Локальная переменная @V_COUNT INT.Если переменная @V_COUNT равна '0' (ноль), возвращаются все записи из таблицы, в противном случае возвращается количество {@V_COUNT} записей из таблицы.Например, если @V_COUNT = 50, вернуть TOP 50 записей.Если @V_COUNT равно 0, вернуть TOP 100 PERCENT записей.Можем ли мы достичь этого в одном запросе?

Пример запроса:

DECLARE @V_COUNT INT = 0

SELECT  TOP (CASE WHEN @V_COUNT > 0 THEN  @V_COUNT ELSE  100 PERCENT END) *
FROM    MY_TABLE
ORDER BY COL1

Неверный синтаксис рядом с ключевым словом «процент»

Ответы [ 5 ]

0 голосов
/ 12 октября 2018
DECLARE @V_COUNT int = 3
select * 
from 
  MY_TABLE 
ORDER BY 
Service_Id asc  
offset case when @V_COUNT >0 then  ((select count(*) from MY_TABLE)- @V_COUNT) else @V_COUNT end rows
0 голосов
/ 12 октября 2018

SET ROWCOUNT принуждает вас к процедурной логике.Кроме того, вам нужно будет указать абсолютное число.PERCENT потребуются какие-то вычисления ...

Вы можете попробовать это:

DECLARE @Percent FLOAT = 50;

SELECT  TOP (SELECT CAST(CAST((SELECT COUNT(*) FROM sys.objects) AS FLOAT)/100.0 * CASE WHEN @Percent=0 THEN 100 ELSE @Percent END +1 AS INT))  o.*
FROM    sys.objects o
ORDER BY o.[name];

Это выглядит немного неуклюже, но вычисление будет выполнено один раз в течение микросекунд ...

0 голосов
/ 12 октября 2018

Вы можете сделать что-то вроде:

DECLARE @V_COUNT INT = 0

SELECT  TOP (CASE WHEN @V_COUNT > 0 THEN  @V_COUNT ELSE (SELECT COUNT(1) FROM MY_TABLE) END) *
FROM    MY_TABLE
0 голосов
/ 12 октября 2018

Лучшим решением было бы вообще не использовать TOP - но вместо этого ROWCOUNT:

SET ROWCOUNT останавливает обработку после указанного числа строк.
...
Чтобы вернуть все строки, установите ROWCOUNT в 0.

Обратите внимание, что ROWCOUNT рекомендуется использовать только с select операторами -

Важно
Использование SET ROWCOUNT не повлияет на операторы DELETE, INSERT и UPDATE в будущем выпуске SQL Server.Избегайте использования операторов SET ROWCOUNT с DELETE, INSERT и UPDATE в новых разработках и запланируйте модификацию приложений, которые в настоящее время используют их.Для аналогичного поведения используйте синтаксис TOP.

DECLARE @V_COUNT INT = 0

SET ROWCOUNT @V_COUNT -- 0 means return all rows...

SELECT   *
FROM    MY_TABLE
ORDER BY COL1

SET ROWCOUNT 0 -- Avoid side effects...

Это избавит вас от необходимости знать, сколько строк в таблице

Обязательно повторитеустановите ROWCOUNT обратно на 0 после запроса, чтобы избежать побочных эффектов (Хорошая точка зрения Шнуго в комментариях).

0 голосов
/ 12 октября 2018

Вместо 100 процентов вы можете написать очень большое число, которое, несомненно, будет больше, чем возможное количество строк, возвращаемых запросом, например.max int, равное 2147483647.

...