W SQL Server możesz użyć SET ROWCOUNT
aby ograniczyć liczbę wierszy zwracanych przez zapytanie.
Sposób działania polega na tym, że SQL Server przestaje przetwarzać zapytanie po zwróceniu określonej liczby wierszy.
Jest podobny do TOP()
klauzula, ale z tą różnicą, że SET ROWCOUNT
jest ustawiona poza zapytaniem i będzie miała wpływ na wszystkie kolejne zapytania.
Przykład
Oto przykład do zademonstrowania.
Najpierw zróbmy zapytanie bez ustawienie ROWCOUNT
.
SELECT * FROM Dogs;
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+ (4 rows affected)
Więc cztery wiersze są zwracane bez ustawienia ROWCOUNT
.
Teraz użyjmy SET ROWCOUNT
aby ograniczyć liczbę wierszy, a następnie uruchom zapytanie ponownie.
SET ROWCOUNT 2;
SELECT * FROM Dogs;
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Kolejne zapytania
Jak wspomniano, SET ROWCOUNT
wpływa na wszystkie kolejne zapytania.
Jeśli uruchomię następujące zapytanie bezpośrednio po poprzednim, zwrócone zostaną również dwa wiersze.
SELECT * FROM Cats;
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Dzieje się tak pomimo faktu, że trzy wiersze zostałyby zwrócone, gdybym nie użył SET ROWCOUNT
aby ograniczyć zwracane wiersze.
Mogę to zweryfikować za pomocą COUNT()
klauzula.
SELECT COUNT(*) FROM Cats;
Wynik:
+--------------------+ | (No column name) | |--------------------| | 3 | +--------------------+
Zresetuj ROWCOUNT
Możesz zresetować ROWCOUNT
wartość poprzez nadanie jej wartości 0
(zero).
Oznacza to, że zapytania nie będą już miały ograniczonych wyników. Zapytanie będzie przetwarzane do samego końca.
SET ROWCOUNT 0;
SELECT * FROM Cats;
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected)
ROWCOUNT kontra TOP()
Jeśli używasz TOP()
klauzula w zapytaniu, gdy już ustawiłeś ROWCOUNT
, Twoje ROWCOUNT
ustawienie zastąpi tylko TOP()
jeśli ROWCOUNT
to mniejsza wartość.
Oto przykład, w którym ROWCOUNT
to większa wartość.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
W tym przypadku TOP()
Klauzula wygrała.
A oto przykład, gdzie ROWCOUNT
to mniejsza wartość.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | +---------+-----------+ (1 row affected)
Kompatybilność
Pamiętaj, że firma Microsoft zaleca, aby SET ROWCOUNT
nie wpłynie na DELETE
, INSERT
i UPDATE
oświadczenia w przyszłej wersji programu SQL Server. Firma Microsoft zaleca unikanie takiego użycia w nowych pracach programistycznych i planuje modyfikowanie aplikacji, które obecnie z niego korzystają.
Microsoft zaleca używanie TOP()
klauzula, jeśli chcesz ograniczyć liczbę wierszy, których dotyczy DELETE
, INSERT
i UPDATE
oświadczenia.
Uwaga
ROWCOUNT
opcja działa na większości instrukcji T-SQL, w tym na wyzwalaczach. Nie ma to jednak wpływu na kursory dynamiczne, ale ogranicza zestaw wierszy zestawu kluczy i niewrażliwych kursorów. Dlatego z tej opcji należy korzystać ostrożnie.