Использование SET ROWCOUNT в SQL Server - ограничение набора результатов - PullRequest
3 голосов
/ 12 декабря 2008

У меня есть оператор SQL, который состоит из нескольких операторов SELECT. Я хочу ограничить общее количество возвращающихся строк, скажем, 1000 строк. Я думал, что использование директивы SET ROWCOUNT 1000 сделает это ... но это не так. Например:

SET ROWCOUNT 1000

select orderId from TableA

select name from TableB

Первоначально я думал, что SET ROWCOUNT будет применяться к всей партии, а не к отдельным операторам внутри нее. Поведение, которое я вижу, заключается в том, что первый выбор будет ограничен 1000, а второй - 1000, что в общей сложности вернет 2000 строк. Есть ли способ применить лимит 1000 к партии в целом?

Ответы [ 8 ]

2 голосов
/ 12 декабря 2008

Не в одном утверждении. Вам нужно будет вычесть @@ ROWCOUNT из общего количества строк, которое вы хотите после каждого оператора, и использовать переменную (скажем, «@RowsLeft») для хранения оставшихся строк, которые вы хотите. Затем вы можете выбрать TOP @RowsLeft из каждого отдельного запроса ...

1 голос
/ 22 октября 2010

SET ROWCOUNT применяется к каждому отдельному запросу. В данном примере он применяется дважды, по одному разу для каждого оператора SELECT, поскольку каждый оператор является своим собственным пакетом (они не сгруппированы, не объединены и т. Д. И поэтому выполняются полностью отдельно).

@ Подход RedFilter, скорее всего, даст вам то, что вы хотите.

1 голос
/ 12 декабря 2008

Требование звучит странно. Если вы не объединяете или не объединяете данные из двух селекторов, рассматривать их как единое целое, так что вы применяете максимальное количество строк, просто не имеет смысла, так как они являются несвязанными запросами в этой точке. Если вам действительно нужно это сделать, попробуйте:

select top 1000 from (
    select orderId, null as name, 'TableA' as Source from TableA
    union all
    select null as orderID, name, 'TableB' as Source from TableB
) a order by Source
1 голос
/ 12 декабря 2008

И как бы вы увидели какие-либо записи из второго запроса, если первый всегда возвращает более 1000, если вы смогли сделать это в пакете?

Если запросы достаточно похожи, вы можете попытаться сделать это через объединение и использовать для этого количество строк, поскольку в этот момент это будет только один запрос. Если запросы возвращаются по-разному, я не уверен, что вы получите, ограничив всю группу до 1000 строк, потому что значения будут другими. С точки зрения пользователя, я бы скорее последовательно получал 500 заказов и 500 имен клиентов, чем 998 рудеров и 2 имени в один день, 210 заказов и 790 имен в следующий. Было бы невозможно использовать приложение, особенно если вас больше всего интересовала информация во втором запросе.

1 голос
/ 12 декабря 2008

Используйте TOP, а не ROWCOUNT

http://msdn.microsoft.com/en-us/library/ms189463.aspx

Вы пытаетесь получить 1000 строк MAX из всех таблиц, верно?

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

1 голос
/ 12 декабря 2008

Не проверено и не использует ROWCOUNT, но может дать вам идею?

Предполагается, что col1 в TableA и TableB одного типа.

SELECT TOP 1000 * 
FROM (select orderId 
      from TableA 
      UNION ALL 
      select name from TableB) t
0 голосов
/ 16 сентября 2013

это ваше решение:

TOP (Transact-SQL)

и о @@ RowCount вы можете прочитать по этой ссылке:

SET ROWCOUNT (Transact-SQL)

enter image description here Важно

Использование операторов SET ROWCOUNT will not affect DELETE, INSERT и UPDATE в будущих версиях SQL Server. Avoid с использованием SET ROWCOUNT с операторами DELETE, INSERT и UPDATE в новых разработках и планированием модификации приложений, которые в настоящее время используют его. Для аналогичного поведения используйте синтаксис TOP. Для получения дополнительной информации см. TOP (Transact-SQL) .

Я думаю, что будет работать два пути.!

0 голосов
/ 22 октября 2010

У меня сработало следующее:

CREATE PROCEDURE selectTopN
(
    @numberOfRecords int
)
AS
    SELECT TOP (@numberOfRecords) * FROM Customers
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...