TOP (Transact-SQL)

Especifica que sólo se devolverá el primer conjunto de filas del resultado de la consulta. El conjunto de filas puede ser un número o un porcentaje de las filas. La expresión TOP se puede usar en instrucciones SELECT, INSERT, UPDATE, MERGE y DELETE.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

[ 
     TOP (expression) [PERCENT]
     [ WITH TIES ]
]

Argumentos

  • expression
    Es la expresión numérica que especifica el número de filas que se devolverán. El valor expression se convierte implícitamente a un valor float si se especificó PERCENT; de lo contrario, se convierte a bigint.

    En instrucciones INSERT, UPDATE, MERGE y DELETE, se requieren paréntesis que delimiten el valor expression en TOP. Por compatibilidad con versiones anteriores se admite TOP expression sin paréntesis en instrucciones SELECT, pero no se recomienda usar esto.

    Si la consulta contiene una cláusula ORDER BY, se devolverán las primeras filas de expression o el porcentaje de filas de expression ordenadas por la cláusula ORDER BY. Cuando la consulta no tiene una cláusula ORDER BY, el orden de las filas es arbitrario.

  • PERCENT
    Indica que la consulta devuelve sólo el primer porcentaje de filas de expression del conjunto de resultados.

  • WITH TIES
    Especifica que las filas adicionales se devolverán del conjunto de resultados base con el mismo valor en las columnas ORDER BY que el que aparece en la última de las filas de TOP n (PERCENT). TOP...WITH TIES sólo se puede especificar en instrucciones SELECT y siempre que haya una cláusula ORDER BY especificada.

    [!NOTA]

    El orden devuelto de los registros que se vinculan es arbitrario. ORDER BY no afecta a esta regla.

Notas

TOP no se puede utilizar conjuntamente con instrucciones UPDATE y DELETE en vistas con particiones.

Las filas a las que se hace referencia en la expresión TOP utilizadas con INSERT, UPDATE, MERGE o DELETE no presentan ningún orden. TOP n devuelve n filas aleatorias. Por ejemplo, la siguiente instrucción de INSERT contiene la cláusula ORDER BY y aún así esta cláusula no afecta a las filas a las que se hace referencia directamente en la instrucción INSERT.

INSERT TOP (2) INTO Table2 (ColumnB) 
    SELECT ColumnA FROM Table1 
    ORDER BY ColumnA;

La cláusula ORDER BY de la consulta anterior sólo hace referencia a las filas devueltas por la instrucción SELECT anidada. La instrucción INSERT elige cualquiera de las dos filas devueltas por la instrucción SELECT. Para garantizar que se hayan insertado las dos filas superiores de la subconsulta SELECT, vuelva a escribir la consulta de la manera siguiente.

INSERT INTO Table2 (ColumnB) 
    SELECT TOP (2) ColumnA FROM Table1 
    ORDER BY ColumnA;

SQL Server permite la actualización de vistas creadas con la cláusula TOP. Dado que la cláusula TOP se incluye en la definición de vista, es posible que algunas filas puedan desaparecer de la vista a causa de una actualización, si el resultado ya no cumple con los requisitos de la expresión TOP. Para obtener más información, vea Modificar datos mediante una vista.

La expresión TOP de una consulta no afecta a las instrucciones que se pueden ejecutar a partir de la activación de un desencadenador. Las tablas insertadas y actualizadas en los desencadenadores sólo mostrarán las filas verdaderamente afectadas por las instrucciones INSERT, UPDATE, MERGE o DELETE.

Utilizar TOP en la instrucción MERGE

Cuando se especifica en la instrucción MERGE, la cláusula TOP se aplica después de que la tabla de origen completa y la tabla de destino completa se combinen, y se quitan las filas combinadas que no certifican las acciones de inserción, actualización o eliminación. La cláusula TOP reduce aún más el número de filas combinadas al valor especificado y se aplican las acciones de inserción, actualización o eliminación a las filas combinadas restantes de una manera desordenada. Es decir, no hay ningún orden en el que las filas se distribuyan entre las acciones definidas en las cláusulas WHEN. Por ejemplo, cuando se especifica TOP (10) afecta a 10 filas; de estas filas, 7 se pueden actualizar y 3 insertar, o se puede eliminar 1, actualizar 5 e insertar 4, etc.

Dado que la instrucción MERGE realiza exámenes de tabla completos de ambas tablas, de destino y de origen, el rendimiento de E/S puede verse afectado al utilizar la cláusula TOP para modificar una tabla grande mediante la creación de varios lotes. En este escenario, es importante asegurase de que todos los lotes sucesivos destinen nuevas filas. Para obtener más información, vea Optimizar el rendimiento de la instrucción MERGE.

Ejemplos

A. Usar TOP con variables

En el ejemplo siguiente se utiliza una variable para obtener los 10 primeros empleados enumerados en la tabla dbo.Employee de la base de datos AdventureWorks.

USE AdventureWorks;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO

B. Usar TOP con PERCENT y WITH TIES

En el ejemplo siguiente se obtiene el 10% de los empleados que tienen los salarios más altos y los devuelve en orden descendente de acuerdo con el salario base. La especificación de WITH TIES garantiza que también se incluyan los empleados con salarios iguales al salario más bajo en el conjunto de resultados, aun cuando esto exceda el 10% de los empleados.

USE AdventureWorks;
GO
SELECT TOP(10) PERCENT WITH TIES
c.FirstName, c.LastName, e.Title, e.Gender, r.Rate
FROM Person.Contact AS c 
    INNER JOIN HumanResources.Employee AS e
        ON c.ContactID = e.ContactID
    INNER JOIN HumanResources.EmployeePayHistory AS r
        ON r.EmployeeID = e.EmployeeID
ORDER BY Rate DESC;