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

Come funziona SET ROWCOUNT in SQL Server

In SQL Server puoi utilizzare SET ROWCOUNT per limitare le righe restituite da una query.

Il modo in cui funziona è che provoca l'interruzione dell'elaborazione della query da parte di SQL Server dopo la restituzione del numero di righe specificato.

È simile a TOP() clausola, ma con la differenza che SET ROWCOUNT è impostato al di fuori della query e influirà su tutte le query successive.

Esempio

Ecco un esempio da dimostrare.

Per prima cosa, eseguiamo una query senza impostando ROWCOUNT .

SELECT * FROM Dogs;

Risultato:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+
(4 rows affected)

Quindi vengono restituite quattro righe senza impostare ROWCOUNT .

Ora utilizziamo SET ROWCOUNT per limitare il numero di righe, quindi eseguire nuovamente la query.

SET ROWCOUNT 2;
SELECT * FROM Dogs;

Risultato:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
+---------+-----------+
(2 rows affected)

Query successive

Come accennato, SET ROWCOUNT influisce su tutte le query successive.

Se eseguo la query seguente subito dopo la precedente, vengono restituite anche due righe.

SELECT * FROM Cats;

Risultato:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
+---------+-----------+
(2 rows affected)

Questo nonostante il fatto che sarebbero state restituite tre righe, se non avessi usato SET ROWCOUNT per limitare le righe restituite.

Posso verificarlo con COUNT() clausola.

SELECT COUNT(*) FROM Cats;

Risultato:

+--------------------+
| (No column name)   |
|--------------------|
| 3                  |
+--------------------+

Reimposta ROWCOUNT

Puoi reimpostare il ROWCOUNT value assegnandogli un valore di 0 (zero).

Ciò significa che le query non avranno più risultati limitati. La query continuerà l'elaborazione fino alla fine.

SET ROWCOUNT 0;
SELECT * FROM Cats;

Risultato:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+
(3 rows affected)

ROWCOUNT vs TOP()

Se usi TOP() clausola in una query quando hai già impostato il tuo ROWCOUNT , il tuo ROWCOUNT l'impostazione sovrascriverà solo TOP() se ROWCOUNT è il valore più piccolo.

Ecco un esempio in cui ROWCOUNT è il valore maggiore.

SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;

Risultato:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
+---------+-----------+
(2 rows affected)

In questo caso, il TOP() la clausola ha vinto.

Ed ecco un esempio in cui ROWCOUNT è il valore più piccolo.

SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;

Risultato:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
+---------+-----------+
(1 row affected)

Compatibilità

Tieni presente che Microsoft consiglia di SET ROWCOUNT non influirà su DELETE , INSERT e UPDATE istruzioni in una versione futura di SQL Server. Microsoft consiglia di evitare tale utilizzo nel nuovo lavoro di sviluppo e di pianificare la modifica delle applicazioni che attualmente lo utilizzano.

Microsoft consiglia di utilizzare TOP() clausola se è necessario limitare le righe interessate in DELETE , INSERT e UPDATE dichiarazioni.

Attenzione

Il ROWCOUNT l'opzione funziona sulla maggior parte delle istruzioni T-SQL, inclusi i trigger. Tuttavia, non influisce sui cursori dinamici, ma limita il set di righe di keyset e cursori insensibili. Questa opzione dovrebbe quindi essere utilizzata con cautela.