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.