sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona SET ROWCOUNT en SQL Server

En SQL Server, puede usar SET ROWCOUNT para limitar las filas devueltas por una consulta.

La forma en que funciona es que hace que SQL Server deje de procesar la consulta después de que se devuelva el número especificado de filas.

Es similar al TOP() cláusula, pero con la diferencia de que SET ROWCOUNT se establece fuera de la consulta y afectará a todas las consultas posteriores.

Ejemplo

Aquí hay un ejemplo para demostrarlo.

Primero, hagamos una consulta sin configurando ROWCOUNT .

SELECT * FROM Dogs;

Resultado:

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

Entonces se devuelven cuatro filas sin configurar ROWCOUNT .

Ahora usemos SET ROWCOUNT para limitar el número de filas, luego vuelva a ejecutar la consulta.

SET ROWCOUNT 2;
SELECT * FROM Dogs;

Resultado:

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

Consultas posteriores

Como se mencionó, SET ROWCOUNT afecta a todas las consultas posteriores.

Si ejecuto la siguiente consulta inmediatamente después de la anterior, también se devuelven dos filas.

SELECT * FROM Cats;

Resultado:

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

Esto es a pesar del hecho de que se habrían devuelto tres filas si no hubiera usado SET ROWCOUNT para limitar las filas que se devuelven.

Puedo verificar esto con COUNT() cláusula.

SELECT COUNT(*) FROM Cats;

Resultado:

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

Restablecer RECUENTO DE FILAS

Puede restablecer el ROWCOUNT valor dándole un valor de 0 (cero).

Esto significa que las consultas ya no tendrán sus resultados limitados. La consulta seguirá procesándose hasta el final.

SET ROWCOUNT 0;
SELECT * FROM Cats;

Resultado:

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

CONTADOR DE FILAS vs SUPERIOR()

Si usa el TOP() cláusula en una consulta cuando ya ha configurado su ROWCOUNT , su ROWCOUNT la configuración solo anulará TOP() si ROWCOUNT es el valor más pequeño.

Aquí hay un ejemplo donde ROWCOUNT es el valor mayor.

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

Resultado:

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

En este caso, el TOP() ganó la cláusula.

Y aquí hay un ejemplo donde ROWCOUNT es el valor más pequeño.

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

Resultado:

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

Compatibilidad

Tenga en cuenta que Microsoft aconseja que SET ROWCOUNT no afectará DELETE , INSERT y UPDATE instrucciones en una versión futura de SQL Server. Microsoft recomienda que evite dicho uso en nuevos trabajos de desarrollo y planee modificar las aplicaciones que actualmente lo usan.

Microsoft recomienda usar TOP() cláusula si necesita limitar las filas afectadas en DELETE , INSERT y UPDATE declaraciones.

Precaución

El ROWCOUNT La opción funciona en la mayoría de las declaraciones de T-SQL, incluidos los disparadores. Sin embargo, no afecta a los cursores dinámicos, pero limita el conjunto de filas de cursores insensibles y de conjunto de claves. Por lo tanto, esta opción debe usarse con precaución.