I SQL Server kan du använda SET ROWCOUNT
för att begränsa raderna som returneras av en fråga.
Sättet det fungerar på är att det gör att SQL Server slutar bearbeta frågan efter att det angivna antalet rader har returnerats.
Det liknar TOP()
sats, men med skillnaden att SET ROWCOUNT
ställs utanför frågan och kommer att påverka alla efterföljande frågor.
Exempel
Här är ett exempel att visa.
Låt oss först göra en fråga utan inställning ROWCOUNT
.
SELECT * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+ (4 rows affected)
Så fyra rader returneras utan inställning av ROWCOUNT
.
Låt oss nu använda SET ROWCOUNT
för att begränsa antalet rader, kör sedan frågan igen.
SET ROWCOUNT 2;
SELECT * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Efterföljande frågor
Som nämnts, SET ROWCOUNT
påverkar alla efterföljande frågor.
Om jag kör följande fråga direkt efter den föregående, returneras också två rader.
SELECT * FROM Cats;
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Detta trots att tre rader skulle ha returnerats om jag inte använt SET ROWCOUNT
för att begränsa antalet rader som returneras.
Jag kan verifiera detta med COUNT()
klausul.
SELECT COUNT(*) FROM Cats;
Resultat:
+--------------------+ | (No column name) | |--------------------| | 3 | +--------------------+
Återställ ROWCOUNT
Du kan återställa ROWCOUNT
värde genom att ge det värdet 0
(noll).
Detta innebär att sökresultat inte längre kommer att begränsas. Frågan kommer att fortsätta bearbetas hela vägen till slutet.
SET ROWCOUNT 0;
SELECT * FROM Cats;
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected)
ROWCOUNT vs TOP()
Om du använder TOP()
klausul i en fråga när du redan har ställt in ditt ROWCOUNT
, din ROWCOUNT
inställningen åsidosätter bara TOP()
om ROWCOUNT
är det mindre värdet.
Här är ett exempel där ROWCOUNT
är det större värdet.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
I det här fallet, TOP()
klausul vann.
Och här är ett exempel där ROWCOUNT
är det mindre värdet.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | +---------+-----------+ (1 row affected)
Kompatibilitet
Observera att Microsoft rekommenderar att SET ROWCOUNT
kommer inte att påverka DELETE
, INSERT
och UPDATE
uttalanden i en framtida version av SQL Server. Microsoft rekommenderar att du undviker sådan användning i nytt utvecklingsarbete och planerar att modifiera applikationer som för närvarande använder det.
Microsoft rekommenderar att du använder TOP()
om du behöver begränsa rader som påverkas i DELETE
, INSERT
och UPDATE
uttalanden.
Varning
ROWCOUNT
alternativet fungerar på de flesta T-SQL-satser, inklusive triggers. Det påverkar dock inte dynamiska markörer, men det begränsar raduppsättningen av tangentuppsättningar och okänsliga markörer. Detta alternativ bör därför användas med försiktighet.