Есть ли значение, которое я могу использовать в SELECT TOP, который будет возвращать все строки?

13

Я позволяю конечному пользователю определить, сколько строк возвращается запросом (SELECT TOP (@x)). Есть ли значение, которое можно ввести, когда возвращаются все строки? Или я должен динамически создавать запрос без TOP (@x), если они хотят, чтобы все строки возвращались?

Я использую SQL Server 2012.

Уэйн Э. Пфеффер
источник
Это что TOP ... ORDER BYто? Что- ORDER BYто еще требуется в случае, если вы выбираете все?
Мартин Смит
1
Я полагаю, эээ ... просто пропустить это не TOPможет быть и речи? Как будто вы имеете дело с каким-то предопределенным запросом, и вам нужно что- то передать ?
CorsiKa

Ответы:

17

Ну, это выглядит как TOP является BIGINT , если вы не используете ПРОЦЕНТЫ . Это означает, что вы можете передать максимальное значение BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Я серьезно сомневаюсь, что вы когда-нибудь увидите такой большой стол. Я не уверен, какое влияние это окажет на план запроса.

Кеннет Фишер
источник
7
Предполагая, что переменная @xявляется BIGINT, она SET @x = 0x7fffffffffffffffможет быть более понятной для некоторых. В любом случае легче запомнить.
Мартин Смит
@MartinSmith Я буду честен, я собираюсь искать это в любом случае :), я никогда не видел, что сделанное прежде все же. Это неявное преобразование?
Кеннет Фишер
7
Ну, это легче запомнить, если вы просто запомните для начала, 7а затем все остальное, Fи вам нужно всего 16 символов для 8 байтов. И да, он будет неявно преобразован при назначении переменной этого типа данных.
Мартин Смит
@ MartinSmith Является ли хорошей практикой полагаться на двоичное представление значения? Документации говорится бинарное представление значения может меняться от версии к версии SQL Server . Кроме того, я не знаю, являюсь ли я единственным человеком, которого всегда смущало 0x7fffffffffffffffпредставление максимального значения bigintв SqlServer. Причина заключается в том, что в SqlServer двоичной постоянной записи у вас есть 7fв низком байте, где , как и в языках программирования, как C ++ у вас есть это в высших байтах , чтобы получить максимум знакового интегрального типа.
1
3
@ я-один. Двоичное представление целочисленных типов крайне маловероятно изменится. Не было бы никакого смысла в том, чтобы SQL Server предоставлял побитовые операторы, которые работают с целочисленными типами, если бы не ожидалось, что мы могли бы полагаться на определенный формат.
Мартин Смит
12

Вы также можете рассмотреть

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Вместо того

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

Значение, которое вам нужно установить для @x, это 0отключить его.

Это не рекомендуется для операторов модификации данных, но не рекомендуется для SELECT .

В 2012 году составляется другой план для случая, когда ROWCOUNT равен 0 против некоторого ненулевого значения.

Если ORDER BY Bazтолько для того, чтобы придать смысл, TOPа не предоставить порядок представления результатов, и у вас нет индекса, поддерживающего это, то разделение на два запроса позволит избежать ненужной сортировки в этом 0случае.

Мартин Смит
источник
8

SELECT TOP 100 PERCENT может использоваться для обхода любых ошибок с использованием «TOP» в запросе.

MguerraTorres
источник
1
Для меня это не совсем объясняет причину использования функции, которая оптимизируется. Имеет ли Crystal Reports ожидать заказ, чтобы быть там в определении вида?
Андрей М
Нет, у Crystal Reports есть проблемы с захватом запросов и навязыванием им собственных планов выполнения, что делает их очень неэффективными, а иногда и неточными. Я предпочитаю делать ВСЕ свою логику и дизайн в запросе SQL, и просто сделать его «красивым» в Crystal. Вот почему я по большей части перешел на SSIS / SSRS, но все еще существуют устаревшие отчеты.
MguerraTorres
-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable
Абхилаш Меди
источник
1
Вопрос в параметризации предложения TOP. У OP уже есть параметр ( @x), и теперь они спрашивают, какое значение передать, чтобы @xоно означало «все строки» независимо от того, сколько строк в действительности имеется в таблице. Возможно, вы могли бы выяснить, как адаптировать ваше решение к требованиям ОП.
Андрей М
1
Я сделал корректировки, чтобы соответствовать вопросу, хотя, как написано, это имеет условие гонки, если строки вставляются одновременно. Это потребует блокировки таблицы на время, чтобы решить, что блокирует одновременные вставки. Этого и дополнительных затрат на проверку в первую очередь можно избежать, просто используя большое количество.
Мартин Смит
(SELECT COUNT(*) FROM YourTable)это не значение.
ypercubeᵀᴹ