Limitar los conjuntos de resultados con TOP y PERCENT

Puede utilizar la cláusula TOP para limitar el número de filas devueltas en el conjunto de resultados.

TOP ( expression ) [ PERCENT ] [ WITH TIES ]

expression es una expresión numérica que especifica el número de filas que se van a devolver, o en el caso de que se especifique PERCENT, se devuelve el porcentaje (especificado por expression) de las filas del conjunto de resultados. Por ejemplo:

TOP (120) /*Return the top 120 rows of the result set. */
TOP (15) PERCENT /* Return the top 15 percent of the result set. */.
TOP(@n) /* Return the top @n rows of the result set, with the variable declaration: DECLARE @n AS BIGINT; SET @n = 2 */.

Si una instrucción SELECT que incluya TOP tiene también una cláusula ORDER BY, las filas que se van a devolver se seleccionan del conjunto de resultados ordenado. El conjunto completo de resultados se genera en el orden especificado y se devuelven las n primeras filas del conjunto de resultados ordenado. Si también se especifica WITH TIES, se devuelven todas las filas que contienen el último valor devuelto por la cláusula ORDER BY, aunque al hacerlo se supere el número especificado por expression.

TOP frente a SET ROWCOUNT

El otro método utilizado para limitar el tamaño de un conjunto de resultados consiste en ejecutar una instrucción SET ROWCOUNT n antes de ejecutar otra instrucción. SET ROWCOUNT difiere de TOP en los siguientes aspectos:

  • La cláusula TOP se aplica a la única instrucción SELECT en que se especifica. SET ROWCOUNT permanece activada hasta que se ejecuta otra instrucción SET ROWCOUNT, como, por ejemplo, SET ROWCOUNT 0 para desactivar la opción.

    Nota importanteImportante

    La utilización de SET ROWCOUNT no afectará a las instrucciones DELETE, INSERT ni UPDATE en la próxima versión de SQL Server. Evite utilizar SET ROWCOUNT con las instrucciones DELETE, INSERT y UPDATE en los nuevos trabajos de desarrollo, y modifique las aplicaciones que la utilizan en la actualidad. Recomendamos que las instrucciones DELETE, INSERT y UPDATE que actualmente utilizan SET ROWCOUNT se escriban de nuevo con el fin de utilizar TOP.

    Aunque el efecto de SET ROWCOUNT en las instrucciones SELECT permanece invariable, es preferible usar TOP con SELECT antes que SET ROWCOUNT por los siguientes motivos:

    • SET ROWCOUNT hace que la mayoría de instrucciones SELECT, INSERT, UPDATE y DELETE se detengan cuando ya han procesado el número de filas especificado. Este comportamiento también se aplica para la activación de los desencadenadores.

    • Como parte de una instrucción SELECT, el optimizador de consultas puede utilizar el valor de expression en la cláusula TOP como parte del proceso de generación de un plan de ejecución para una consulta. Puesto que SET ROWCOUNT se utiliza fuera de una instrucción que ejecuta una consulta, su valor no se puede utilizar para generar un plan de consultas para la consulta.