Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von SET ROWCOUNT in SQL Server

In SQL Server können Sie SET ROWCOUNT verwenden um die von einer Abfrage zurückgegebenen Zeilen einzuschränken.

Es bewirkt, dass SQL Server die Verarbeitung der Abfrage stoppt, nachdem die angegebene Anzahl von Zeilen zurückgegeben wurde.

Es ähnelt dem TOP() -Klausel, aber mit dem Unterschied, dass SET ROWCOUNT wird außerhalb der Abfrage gesetzt und wirkt sich auf alle nachfolgenden Abfragen aus.

Beispiel

Hier ist ein Beispiel zur Veranschaulichung.

Lassen Sie uns zuerst eine Abfrage ohne durchführen Einstellung von ROWCOUNT .

SELECT * FROM Dogs;

Ergebnis:

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

Es werden also vier Zeilen zurückgegeben, ohne dass ROWCOUNT gesetzt wird .

Lassen Sie uns nun SET ROWCOUNT verwenden um die Anzahl der Zeilen zu begrenzen, führen Sie die Abfrage dann erneut aus.

SET ROWCOUNT 2;
SELECT * FROM Dogs;

Ergebnis:

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

Nachträgliche Abfragen

Wie bereits erwähnt, SET ROWCOUNT wirkt sich auf alle nachfolgenden Abfragen aus.

Wenn ich die folgende Abfrage unmittelbar nach der vorherigen ausführe, werden auch zwei Zeilen zurückgegeben.

SELECT * FROM Cats;

Ergebnis:

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

Dies trotz der Tatsache, dass drei Zeilen zurückgegeben worden wären, wenn ich nicht SET ROWCOUNT verwendet hätte um die zurückgegebenen Zeilen zu begrenzen.

Ich kann dies mit dem COUNT() überprüfen Klausel.

SELECT COUNT(*) FROM Cats;

Ergebnis:

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

ROWCOUNT zurücksetzen

Sie können ROWCOUNT zurücksetzen Wert, indem Sie ihm den Wert 0 zuweisen (Null).

Das bedeutet, dass die Ergebnisse von Abfragen nicht mehr eingeschränkt werden. Die Abfrage wird bis zum Ende weiter verarbeitet.

SET ROWCOUNT 0;
SELECT * FROM Cats;

Ergebnis:

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

ROWCOUNT vs. TOP()

Wenn Sie den TOP() verwenden -Klausel in einer Abfrage, wenn Sie Ihren ROWCOUNT bereits festgelegt haben , Ihr ROWCOUNT Die Einstellung überschreibt nur TOP() wenn ROWCOUNT ist der kleinere Wert.

Hier ist ein Beispiel, in dem ROWCOUNT ist der größere Wert.

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

Ergebnis:

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

In diesem Fall das TOP() Klausel hat sich durchgesetzt.

Und hier ist ein Beispiel, in dem ROWCOUNT ist der kleinere Wert.

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

Ergebnis:

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

Kompatibilität

Beachten Sie, dass Microsoft zu SET ROWCOUNT rät wirkt sich nicht auf DELETE aus , INSERT , und UPDATE -Anweisungen in einer zukünftigen Version von SQL Server. Microsoft empfiehlt, dass Sie eine solche Verwendung in neuen Entwicklungsarbeiten vermeiden und planen, Anwendungen zu ändern, die es derzeit verwenden.

Microsoft empfiehlt die Verwendung von TOP() -Klausel, wenn Sie die betroffenen Zeilen in DELETE einschränken müssen , INSERT , und UPDATE Aussagen.

Achtung

Der ROWCOUNT Option funktioniert bei den meisten T-SQL-Anweisungen, einschließlich Triggern. Es wirkt sich jedoch nicht auf dynamische Cursor aus, schränkt jedoch das Rowset von Keyset- und insensitiven Cursorn ein. Diese Option sollte daher mit Vorsicht verwendet werden.