sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fungerer SET ROWCOUNT i SQL Server

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.


  1. Rank funktion i MySQL

  2. Find refererede enheder i SQL Server:sys.dm_sql_referenced_entities

  3. Husk dette, når du formaterer en TIME-datatype i SQL Server (T-SQL)

  4. Opdater data via en funktion med tabelværdi i SQL Server