Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de SET ROWCOUNT dans SQL Server

Dans SQL Server, vous pouvez utiliser SET ROWCOUNT pour limiter les lignes renvoyées par une requête.

La façon dont cela fonctionne est qu'il provoque l'arrêt du traitement de la requête par SQL Server après le retour du nombre spécifié de lignes.

C'est similaire au TOP() clause, mais à la différence que SET ROWCOUNT est défini en dehors de la requête et affectera toutes les requêtes suivantes.

Exemple

Voici un exemple pour illustrer.

D'abord, faisons une requête sans paramètre ROWCOUNT .

SELECT * FROM Dogs;

Résultat :

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

Ainsi, quatre lignes sont renvoyées sans définir ROWCOUNT .

Utilisons maintenant SET ROWCOUNT pour limiter le nombre de lignes, puis relancez la requête.

SET ROWCOUNT 2;
SELECT * FROM Dogs;

Résultat :

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

Requêtes ultérieures

Comme mentionné, SET ROWCOUNT affecte toutes les requêtes suivantes.

Si j'exécute la requête suivante immédiatement après la précédente, deux lignes sont également renvoyées.

SELECT * FROM Cats;

Résultat :

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

Ceci malgré le fait que trois lignes auraient été renvoyées si je n'avais pas utilisé SET ROWCOUNT pour limiter les lignes renvoyées.

Je peux vérifier cela avec le COUNT() clause.

SELECT COUNT(*) FROM Cats;

Résultat :

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

Réinitialiser ROWCOUNT

Vous pouvez réinitialiser le ROWCOUNT value en lui attribuant la valeur 0 (zéro).

Cela signifie que les requêtes ne verront plus leurs résultats limités. La requête continuera à être traitée jusqu'à la fin.

SET ROWCOUNT 0;
SELECT * FROM Cats;

Résultat :

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

ROWCOUNT contre TOP()

Si vous utilisez le TOP() clause dans une requête lorsque vous avez déjà défini votre ROWCOUNT , votre ROWCOUNT paramètre ne remplacera que TOP() si ROWCOUNT est la plus petite valeur.

Voici un exemple où ROWCOUNT est la plus grande valeur.

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

Résultat :

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

Dans ce cas, le TOP() clause l'a emporté.

Et voici un exemple où ROWCOUNT est la plus petite valeur.

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

Résultat :

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

Compatibilité

Notez que Microsoft conseille que SET ROWCOUNT n'affectera pas DELETE , INSERT , et UPDATE instructions dans une future version de SQL Server. Microsoft vous recommande d'éviter une telle utilisation dans les nouveaux travaux de développement et de prévoir de modifier les applications qui l'utilisent actuellement.

Microsoft recommande d'utiliser le TOP() clause si vous devez limiter les lignes affectées dans DELETE , INSERT , et UPDATE déclarations.

Attention

Le ROWCOUNT L'option fonctionne sur la plupart des instructions T-SQL, y compris les déclencheurs. Cependant, cela n'affecte pas les curseurs dynamiques, mais cela limite l'ensemble de lignes de jeu de clés et les curseurs insensibles. Cette option doit donc être utilisée avec prudence.