V SQL Server můžete použít SET ROWCOUNT
k omezení řádků vrácených dotazem.
Funguje to tak, že SQL Server přestane zpracovávat dotaz poté, co se vrátí zadaný počet řádků.
Je to podobné jako TOP()
klauzule, ale s tím rozdílem, že SET ROWCOUNT
je nastaven mimo dotaz a ovlivní všechny následující dotazy.
Příklad
Zde je příklad k demonstraci.
Nejprve proveďte dotaz bez nastavení ROWCOUNT
.
SELECT * FROM Dogs;
Výsledek:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+ (4 rows affected)
Takže jsou vráceny čtyři řádky bez nastavení ROWCOUNT
.
Nyní použijeme SET ROWCOUNT
chcete-li omezit počet řádků, spusťte dotaz znovu.
SET ROWCOUNT 2;
SELECT * FROM Dogs;
Výsledek:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Následné dotazy
Jak již bylo zmíněno, SET ROWCOUNT
ovlivní všechny následující dotazy.
Pokud spustím následující dotaz bezprostředně po předchozím, vrátí se také dva řádky.
SELECT * FROM Cats;
Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
A to navzdory skutečnosti, že by byly vráceny tři řádky, kdybych nepoužil SET ROWCOUNT
omezit vracené řádky.
Mohu to ověřit pomocí COUNT()
doložka.
SELECT COUNT(*) FROM Cats;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | 3 | +--------------------+
Resetovat ROWCOUNT
ROWCOUNT
můžete resetovat hodnotu tím, že mu přiřadíte hodnotu 0
(nula).
To znamená, že výsledky dotazů již nebudou omezeny. Dotaz bude pokračovat ve zpracování až do konce.
SET ROWCOUNT 0;
SELECT * FROM Cats;
Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected)
ROWCOUNT vs. TOP()
Pokud použijete TOP()
klauzuli v dotazu, když jste již nastavili ROWCOUNT
, váš ROWCOUNT
nastavení přepíše pouze TOP()
pokud ROWCOUNT
je menší hodnota.
Zde je příklad ROWCOUNT
je větší hodnota.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;
Výsledek:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
V tomto případě TOP()
klauzule zvítězila.
A zde je příklad ROWCOUNT
je menší hodnota.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;
Výsledek:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | +---------+-----------+ (1 row affected)
Kompatibilita
Společnost Microsoft doporučuje SET ROWCOUNT
neovlivní DELETE
, INSERT
a UPDATE
příkazy v budoucí verzi SQL Server. Společnost Microsoft doporučuje, abyste se takovému použití v nových vývojových pracích vyhnuli a plánovali upravit aplikace, které jej aktuálně používají.
Společnost Microsoft doporučuje používat TOP()
klauzule, pokud potřebujete omezit řádky ovlivněné v DELETE
, INSERT
a UPDATE
prohlášení.
Pozor
ROWCOUNT
volba funguje na většině příkazů T-SQL, včetně spouštěčů. Neovlivní však dynamické kurzory, ale omezí sadu řádků sady klíčů a necitlivé kurzory. Tuto možnost byste proto měli používat opatrně.