Чи є значення, яке я можу використовувати в SELECT TOP, який поверне всі рядки?


13

Я дозволяю кінцевому користувачеві визначити, скільки рядків повертається за допомогою запиту (SELECT TOP (@x)). Чи є значення, яке можна ввести там, де повертаються всі рядки? Або мені потрібно динамічно створювати запит без ТОПу (@x), якщо вони хочуть, щоб усі рядки повернулися?

Я використовую SQL Server 2012.


Це TOP ... ORDER BYщось? Чи ORDER BYвсе-таки потрібно щось у тому випадку, коли ви обираєте все?
Мартін Сміт

1
Я думаю, що ... просто пропустити TOPце не йдеться? Наче ви маєте справу з яким-небудь заздалегідь заданим запитом, і вам доведеться щось передати ?
corsiKa

Відповіді:


17

Ну, схоже, ТОП - БІЛЬШЕ, якщо ви не використовуєте PERCENT . Це означає, що ви можете передати максимальне значення 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 ++ у вас є це в вищих байтах , щоб отримати максимум знакового інтегрального типу.
i-one

3
@ i-one. Двійкове представлення цілих типів навряд чи зміниться. Не було б сенсу 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" у запиті.


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ᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.