В SQL Server можете да използвате SET ROWCOUNT
за да ограничите редовете, върнати от заявка.
Начинът, по който работи е, че кара SQL Server да спре обработката на заявката след връщане на посочения брой редове.
Това е подобно на TOP()
клауза, но с тази разлика, че SET ROWCOUNT
се задава извън заявката и ще засегне всички следващи заявки.
Пример
Ето пример за демонстрация.
Първо, нека направим заявка без настройка ROWCOUNT
.
SELECT * FROM Dogs;
Резултат:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+ (4 rows affected)
Така че се връщат четири реда без да се задава ROWCOUNT
.
Сега нека използваме SET ROWCOUNT
за да ограничите броя на редовете, след това изпълнете заявката отново.
SET ROWCOUNT 2;
SELECT * FROM Dogs;
Резултат:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Последващи заявки
Както бе споменато, SET ROWCOUNT
засяга всички следващи заявки.
Ако изпълня следната заявка непосредствено след предишната, също се връщат два реда.
SELECT * FROM Cats;
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Това е въпреки факта, че щяха да бъдат върнати три реда, ако не използвах SET ROWCOUNT
за да ограничите връщаните редове.
Мога да проверя това с COUNT()
клауза.
SELECT COUNT(*) FROM Cats;
Резултат:
+--------------------+ | (No column name) | |--------------------| | 3 | +--------------------+
Нулиране на ROWCOUNT
Можете да нулирате ROWCOUNT
стойност, като му дадете стойност от 0
(нула).
Това означава, че резултатите от заявките вече няма да бъдат ограничени. Заявката ще продължи да обработва чак до края.
SET ROWCOUNT 0;
SELECT * FROM Cats;
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected)
ROWCOUNT срещу TOP()
Ако използвате TOP()
клауза в заявка, когато вече сте задали своя ROWCOUNT
, вашият ROWCOUNT
настройката ще отмени само TOP()
ако ROWCOUNT
е по-малката стойност.
Ето пример, където ROWCOUNT
е по-голямата стойност.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;
Резултат:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
В този случай TOP()
клаузата спечели.
И ето пример, където ROWCOUNT
е по-малката стойност.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;
Резултат:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | +---------+-----------+ (1 row affected)
Съвместимост
Имайте предвид, че Microsoft съветва SET ROWCOUNT
няма да засегне DELETE
, INSERT
и UPDATE
изявления в бъдеща версия на SQL Server. Microsoft препоръчва да избягвате подобно използване в нови разработки и да планирате да модифицирате приложения, които в момента го използват.
Microsoft препоръчва използването на TOP()
клауза, ако трябва да ограничите редовете, засегнати в DELETE
, INSERT
и UPDATE
изявления.
Внимание
ROWCOUNT
опцията работи с повечето T-SQL изрази, включително тригери. Това обаче не засяга динамичните курсори, но ограничава набора от редове от набор от ключове и нечувствителни курсори. Следователно тази опция трябва да се използва с повишено внимание.