Limitando conjuntos de resultados usando TOP e PERCENT

Use a cláusula TOP para limitar o número de linhas que são retornadas no conjunto de resultados.

TOP ( expression ) [ PERCENT ] [ WITH TIES ]

expression é uma expressão numérica que especifica o número de linhas a serem retornadas; ou, se PERCENT for especificada, a porcentagem (especificada por expression) das linhas do conjunto de resultados é retornada. Por exemplo:

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 */.

Se uma instrução SELECT incluindo TOP tiver também uma cláusula ORDER BY, as linhas a serem retornadas serão selecionadas do conjunto de resultados ordenado. O conjunto de resultados total é criado na ordem especificada e as n linhas superiores do conjunto de resultados ordenado são retornadas. Se WITH TIES também estiver especificada, todas as linhas que contêm o último valor retornado pela cláusula ORDER BY serão retornadas, mesmo se fazer isso exceder o número especificado por expression.

TOP versus SET ROWCOUNT

O outro método para limitar o tamanho de um conjunto de resultados é executar uma instrução SET ROWCOUNT n antes de executar uma instrução. SET ROWCOUNT difere de TOP das seguintes maneiras:

  • A cláusula TOP aplica-se a uma única instrução SELECT em que é especificada. SET ROWCOUNT permanece em vigor até que outra instrução SET ROWCOUNT seja executada, como SET ROWCOUNT 0 para desativar a opção.

    Observação importanteImportante

    Usar SET ROWCOUNT não afetará as instruções DELETE, INSERT e UPDATE na próxima versão do SQL Server. Evite usar SET ROWCOUNT com instruções DELETE, INSERT e UPDATE em um novo trabalho de desenvolvimento e planeje modificar os aplicativos que a utilizam atualmente. É recomendado que as instruções DELETE, INSERT e UPDATE que utilizem atualmente SET ROWCOUNT sejam reescritas para usar TOP.

    Embora o efeito de SET ROWCOUNT em instruções SELECT permaneça inalterado, usar TOP com SELECT é preferível a usar SET ROWCOUNT, pelos seguintes motivos:

    • SET ROWCOUNT faz com que a maioria das instruções SELECT INSERT, UPDATE e DELETE parem de processar quando são afetadas pelo número especificado de linhas. Esse comportamento também se aplica ao acionamento de gatilhos.

    • Como parte de uma instrução SELECT, o otimizador de consultas poderá usar o valor de expression na cláusula TOP como parte da geração de um plano de execução para a consulta. Como SET ROWCOUNT é usada fora de uma instrução que executa uma consulta, seu valor não pode ser usado para gerar um plano de consulta para uma consulta.