Поделиться через


Ограничение результирующих наборов с помощью предложений TOP и PERCENT

Чтобы ограничить количество строк, возвращаемых в результирующий набор, можно использовать предложение TOP.

TOP ( expression ) [ PERCENT ] [ WITH TIES ]

Выражение expression является числовым выражением, которое определяет число возвращаемых строк; или, если указан PERCENT, возвращается процентное соотношение строк результирующего набора (указанное при помощи expression). Например:

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

Если в инструкции SELECT вместе с предложением TOP также содержится предложение ORDER BY, возвращаемые строки выбираются из упорядоченного результирующего набора. Весь результирующий набор строится в определенном порядке, и возвращаются верхние строки n этого набора. Если также указывается WITH TIES, возвращаются все строки, содержащие последнее значение, возвращенное предложением ORDER BY, даже если их количество превышает число, указанное expression.

TOP и SET ROWCOUNT

Еще одним способом ограничения размеров результирующего набора является предварительное выполнение инструкции SET ROWCOUNT n. Есть ряд различий между предложениями SET ROWCOUNT и TOP:

  • Предложение TOP применяется только к той инструкции SELECT, в которой оно указано. SET ROWCOUNT продолжает действовать до выполнения другой инструкции SET ROWCOUNT, например SET ROWCOUNT 0, которая выключит этот параметр.

    Важное примечаниеВажно!

    Использование инструкции SET ROWCOUNT не повлияет на работу инструкций DELETE, INSERT и UPDATE в следующем выпуске SQL Server. При программировании избегайте использования инструкции SET ROWCOUNT с инструкциями DELETE, INSERT и UPDATE и постарайтесь внести изменения в приложения, которые используют ее в настоящее время. Рекомендуется заменить инструкцию SET ROWCOUNT на предложение TOP для инструкций DELETE, INSERT и UPDATE.

    Несмотря на то, что действие SET ROWCOUNT на инструкцию SELECT остается прежним, предпочтительно с инструкцией SELECT использовать TOP по ряду причин:

    • Использование инструкции SET ROWCOUNT приводит к тому, что большинство инструкций SELECT, INSERT, UPDATE и DELETE перестают выполняться, обработав указанное количество строк. Такое поведение применимо и по отношению к срабатыванию триггеров.

    • Как часть инструкции SELECT, в процессе формирования плана выполнения запроса оптимизатор запросов может использовать значение expression в предложении TOP. Учитывая то, что SET ROWCOUNT используется вне инструкции, выполняющей запрос, его значение не может быть использовано для формирования плана запроса.