Czy istnieje wartość, której można użyć w SELECT TOP, która zwróci wszystkie wiersze?

13

Pozwalam użytkownikowi końcowemu zdefiniować, ile wierszy jest zwracanych przez zapytanie (SELECT TOP (@x)). Czy istnieje wartość, którą można wprowadzić w miejscu, w którym zwracane są wszystkie wiersze? Czy też muszę dynamicznie tworzyć zapytanie bez TOP (@x), jeśli chcą zwrócić wszystkie wiersze?

Używam SQL Server 2012.

Wayne E. Pfeffer
źródło
Czy to jest TOP ... ORDER BYcoś Czy ORDER BYcoś jest nadal wymagane w przypadku, gdy wybierzesz wszystko?
Martin Smith,
1
Chyba ... pomijając TOPto nie wchodzi w rachubę? Czy masz jakieś predefiniowane zapytanie i musisz coś przekazać ?
corsiKa,

Odpowiedzi:

17

Cóż, wygląda na to, że TOP jest WIELKIM, jeśli nie używasz PROCENTU . Oznacza to, że możesz podać maksymalną wartość BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Poważnie wątpię, czy kiedykolwiek zobaczysz tak duży stół. Nie jestem jednak pewien, jaki wpływ miałby to na plan zapytań.

Kenneth Fisher
źródło
7
Zakładając, że zmienna @xjest WIELKA, SET @x = 0x7fffffffffffffffmoże być dla niektórych bardziej zrozumiała. W każdym razie łatwiej to zapamiętać.
Martin Smith,
@MartinSmith Będę szczery, że i tak to sprawdzę :) Nigdy wcześniej tego nie widziałem. Czy to niejawna konwersja?
Kenneth Fisher
7
Cóż, łatwiej jest zapamiętać, jeśli po prostu pamiętasz, aby zacząć, 7a następnie reszta to Fi potrzebujesz łącznie 16 znaków na 8 bajtów. I tak, zostanie domyślnie przekonwertowany, jeśli zostanie przypisany do zmiennej tego typu danych.
Martin Smith,
@MartinSmith Czy dobrą praktyką jest poleganie na binarnej reprezentacji wartości? Dokumentacja stwierdza binarna reprezentacja wartości mogą ulec zmianie z wersji do wersji SQL Server . Nie wiem też, czy jestem jedyną osobą, która zawsze była zdezorientowana 0x7fffffffffffffffreprezentacją maksymalnej wartości parametru bigintSqlServer. Powodem jest to, że w notacji binarnej SQLSERVER stałej masz 7fw najniższej bajt, gdzie podobnie jak w językach takich jak C ++ masz go w najwyższym bajt dostać max podpisanej integralną typu.
i-one
3
@ i-one. Binarna reprezentacja typów całkowitych jest bardzo mało prawdopodobna do zmiany. Nie ma sensu dostarczanie SQL Server operatorom bitowym, które działają na typach liczb całkowitych, gdyby nie oczekiwano, że będziemy mogli polegać na określonym formacie.
Martin Smith,
12

Możesz również rozważyć

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Zamiast

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

Wartość, którą musisz ustawić @x, to 0wyłączenie.

Jest to przestarzałe w przypadku instrukcji modyfikacji danych, ale nie jest przestarzałe SELECT.

W 2012 r. Opracowywany jest inny plan dla przypadku, który ROWCOUNTwynosi 0 w porównaniu z pewną wartością niezerową.

Jeśli ORDER BY Bazjest to tylko po to, aby nadać znaczenie, TOPa nie podać kolejność prezentacji wyników, a nie masz takiego indeksu, podział na dwa zapytania pozwoliłby uniknąć niepotrzebnego sortowania w tym 0przypadku.

Martin Smith
źródło
8

WYBIERZ TOP 100 PROCENT może być użyty do ominięcia błędów przy użyciu „TOP” w zapytaniu.

MguerraTorres
źródło
1
Dla mnie to tak naprawdę nie wyjaśnia powodu, dla którego warto skorzystać z zoptymalizowanej funkcji. Czy Crystal Reports oczekuje, że w definicji widoku pojawi się ORDER BY?
Andriy M,
Nie, Crystal Reports ma problemy z przejęciem zapytań i wymuszeniem na nich własnych planów wykonania, co czyni je bardzo nieefektywnymi, a czasem niedokładnymi. Wolę wykonywać CAŁĄ moją logikę i projektowanie w zapytaniu SQL i po prostu sprawić, by była „ładna” w Crystal. Właśnie dlatego w większości przeprowadziłem migrację do SSIS / SSRS, ale wciąż istnieją tam starsze raporty.
MguerraTorres
-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable
Abhilash Medi
źródło
1
Pytanie dotyczy parametryzacji klauzuli TOP. OP ma już parametr ( @x) i teraz pytają, jaką wartość przekazać, aby @xoznaczało to „wszystkie wiersze” bez względu na to, ile wierszy faktycznie ma tabela. Może uda ci się dowiedzieć, jak dostosować swoje rozwiązanie do wymagań PO.
Andriy M,
1
Dokonałem korekt, aby pasowały do ​​pytania, ponieważ jak napisano, ma to warunek wyścigu, jeśli wiersze są wstawiane jednocześnie. Wymagałoby to blokady tabeli na czas trwania, aby rozwiązać problem blokowania współbieżnych wstawek. Tego i dodatkowych kosztów sprawdzania w pierwszej kolejności można uniknąć, po prostu stosując dużą liczbę.
Martin Smith,
(SELECT COUNT(*) FROM YourTable)nie jest wartością.
ypercubeᵀᴹ