TOP (Transact-SQL)

Especifica que somente o primeiro conjunto de linhas será retornado do resultado da consulta. O conjunto de linhas pode ser um número ou uma porcentagem das linhas. A expressão TOP pode ser usada nas instruções SELECT, INSERT, UPDATE, MERGE e DELETE.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • expression
    É uma expressão numérica que especifica o número de linhas que serão retornadas. expression é implicitamente convertido em um valor float se PERCENT for especificado; caso contrário, será convertido em bigint.

    Parênteses que delimitam expression em TOP são necessários em instruções INSERT, UPDATE, MERGE e DELETE. Para compatibilidade com versões anteriores, o uso de TOP expression sem parênteses em instruções SELECT possui suporte, mas não é recomendável.

    Se a consulta incluir uma cláusula ORDER BY, serão retornadas as primeiras linhas expression, ou porcentagem de linhas expression, solicitadas pela cláusula ORDER BY. Se a consulta não tiver nenhuma cláusula ORDER BY, a ordem das linhas será arbitrária.

  • PERCENT
    Indica que a consulta retorna apenas os primeiros percentuais de linhas expression do conjunto de resultados.

  • WITH TIES
    Especifica que linhas adicionais são retornadas do conjunto de resultados base com o mesmo valor das colunas que aparecem na última das linhas TOP n (PERCENT). TOP... WITH TIES pode ser especificado somente em instruções SELECT e apenas se uma cláusula ORDER BY estiver especificada.

    ObservaçãoObservação

    A ordem de juntar registros retornada é arbitrária. ORDER BY não afeta esta regra.

Comentários

TOP não pode ser usado junto com instruções UPDATE e DELETE em exibições particionadas.

As linhas referidas na expressão TOP usadas com INSERT, UPDATE, MERGE ou DELETE não são organizadas em nenhuma ordem. TOP n retorna n linhas aleatórias. Por exemplo, a instrução INSERT a seguir contém a cláusula ORDER BY, mas essa cláusula não afeta as linhas diretamente referenciadas pela instrução INSERT.

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

A cláusula ORDER BY nas referências de consulta anteriores referencia somente as linhas que são retornadas pela instrução SELECT aninhada. A instrução INSERT escolhe duas linhas quaisquer retornadas pela instrução SELECT. Para verificar se as primeiras duas linhas da subconsulta SELECT foram inseridas, reescreva a consulta conforme mostrado a seguir.

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

O SQL Server permite atualizar exibições que foram criadas com a cláusula TOP. Como a cláusula TOP foi incluída na definição de exibição, algumas linhas podem desaparecer da exibição por causa de uma atualização se o resultado deixar de atender aos requisitos da expressão TOP. Para obter mais informações, consulte Modificando dados por meio de uma exibição.

A expressão TOP em uma consulta não afeta instruções que podem ser executadas por causa de um gatilho acionado. As tabelas inseridas e atualizadas nos gatilhos mostrarão somente as linhas que realmente foram afetadas pelas instruções INSERT, UPDATE, MERGE ou DELETE.

Usando TOP na instrução MERGE

Quando especificada na instrução MERGE, a cláusula TOP é aplicada depois que toda a tabela de origem e toda a tabela de destino estiverem unidas e as linhas unidas que não são qualificadas para uma ação de inserção, atualização ou exclusão são removidas. A cláusula TOP ainda reduz o número de linhas unidas para o valor especificado e as ações de inserção, atualização ou exclusão são aplicadas às linhas unidas restantes de uma forma não ordenada. Isto é, não há nenhuma ordem na qual as linhas são distribuídas entre as ações definidas nas cláusulas WHEN. Por exemplo, a especificação de TOP (10) afeta 10 linhas. Dessas linhas, 7 podem ser atualizadas e 3 inseridas ou 1 pode ser excluída, 5 atualizadas e 4 inseridas, etc.

Como a instrução MERGE executa um exame completo das tabelas de origem e de destino, o desempenho de E/S pode ser afetado ao usar a cláusula TOP para modificar uma tabela grande criando vários lotes. Neste cenário, é importante garantir que todos os lotes sucessivos destinem novas linhas. Para obter mais informações, consulte Otimizando o desempenho da instrução MERGE.

Exemplos

A. Usando TOP com variáveis

O exemplo a seguir usa uma variável para obter os primeiros 10 funcionários listados na tabela dbo.Employee do banco de dados AdventureWorks2008R2.

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

B. Usando TOP com PERCENT e WITH TIES

O exemplo a seguir obtém os primeiros 10 por cento de todos os funcionários com o mais alto salário e os retorna em ordem descendente, de acordo com a taxa salarial básica. Ao especificar WITH TIES, verifique se os funcionários que possuem salários iguais ao salário mais baixo retornado também foram incluídos no conjunto de resultados, mesmo que isso exceda 10 por cento dos funcionários.

USE AdventureWorks2008R2;
GO
SELECT TOP(10) PERCENT WITH TIES
pp.FirstName, pp.LastName, e.JobTitle, e.Gender, r.Rate
FROM Person.Person AS pp 
    INNER JOIN HumanResources.Employee AS e
        ON pp.BusinessEntityID = e.BusinessEntityID
    INNER JOIN HumanResources.EmployeePayHistory AS r
        ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;