I SQL Server kan du bruge SET ROWCOUNT
for at begrænse de rækker, der returneres af en forespørgsel.
Måden det fungerer på er, at det får SQL Server til at stoppe med at behandle forespørgslen efter det angivne antal rækker er returneret.
Det ligner TOP()
klausul, men med den forskel, at SET ROWCOUNT
er sat uden for forespørgslen og vil påvirke alle efterfølgende forespørgsler.
Eksempel
Her er et eksempel til at demonstrere.
Lad os først lave en forespørgsel uden indstilling ROWCOUNT
.
SELECT * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+ (4 rows affected)
Så fire rækker returneres uden at indstille ROWCOUNT
.
Lad os nu bruge SET ROWCOUNT
for at begrænse antallet af rækker, kør derefter forespørgslen igen.
SET ROWCOUNT 2;
SELECT * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Efterfølgende forespørgsler
Som nævnt, SET ROWCOUNT
påvirker alle efterfølgende forespørgsler.
Hvis jeg kører følgende forespørgsel umiddelbart efter den forrige, returneres to rækker også.
SELECT * FROM Cats;
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Dette er på trods af, at tre rækker ville være blevet returneret, hvis jeg ikke havde brugt SET ROWCOUNT
for at begrænse de rækker, der returneres.
Jeg kan bekræfte dette med COUNT()
klausul.
SELECT COUNT(*) FROM Cats;
Resultat:
+--------------------+ | (No column name) | |--------------------| | 3 | +--------------------+
Nulstil ROWCOUNT
Du kan nulstille ROWCOUNT
værdi ved at give den en værdi på 0
(nul).
Det betyder, at forespørgsler ikke længere vil have deres resultater begrænset. Forespørgslen fortsætter med at behandle hele vejen til slutningen.
SET ROWCOUNT 0;
SELECT * FROM Cats;
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected)
ROWCOUNT vs TOP()
Hvis du bruger TOP()
klausul i en forespørgsel, når du allerede har indstillet din ROWCOUNT
, din ROWCOUNT
indstilling vil kun tilsidesætte TOP()
hvis ROWCOUNT
er den mindste værdi.
Her er et eksempel, hvor ROWCOUNT
er den største værdi.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
I dette tilfælde er TOP()
klausul vandt.
Og her er et eksempel, hvor ROWCOUNT
er den mindste værdi.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | +---------+-----------+ (1 row affected)
Kompatibilitet
Bemærk, at Microsoft anbefaler, at SET ROWCOUNT
vil ikke påvirke DELETE
, INSERT
og UPDATE
udsagn i en fremtidig udgivelse af SQL Server. Microsoft anbefaler, at du undgår sådan brug i nyt udviklingsarbejde og planlægger at ændre programmer, der i øjeblikket bruger det.
Microsoft anbefaler at bruge TOP()
klausul, hvis du har brug for at begrænse rækker berørt i DELETE
, INSERT
og UPDATE
udsagn.
Forsigtig
ROWCOUNT
option virker på de fleste T-SQL-sætninger, inklusive triggere. Det påvirker dog ikke dynamiske markører, men det begrænser rækkesættet af tastesæt og ufølsomme markører. Denne mulighed bør derfor bruges med forsigtighed.