sql >> Databasteknik >  >> RDS >> Sqlserver

Hur SET ROWCOUNT fungerar i SQL Server

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.


  1. Fördelar med att använda SQL Ordinal Position Notation?

  2. MySQL "NOT IN" fråga 3 tabeller

  3. Beräkna en löpande summa i SQL Server

  4. Vad är det bästa sättet att lagra mediefiler i en databas?