Использование SET ROWCOUNT в SQL Server - ограничение набора результатов

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

SET ROWCOUNT 1000

select orderId from TableA

select name from TableB

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

12.12.2008 16:06:03
что вы действительно пытаетесь достичь? Согласно ответу @ HLGEM, это немного странно, как описано.
Rory 12.12.2008 16:22:51
8 ОТВЕТОВ

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

2
12.12.2008 16:08:30

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

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

SELECT TOP 1000 * 
FROM (select orderId 
      from TableA 
      UNION ALL 
      select name from TableB) t
1
31.08.2017 21:53:41

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

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

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

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

1
12.12.2008 16:21:36

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

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

1
12.12.2008 16:17:18

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

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.12.2008 16:46:04

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

CREATE PROCEDURE selectTopN
(
    @numberOfRecords int
)
AS
    SELECT TOP (@numberOfRecords) * FROM Customers
GO
0
22.10.2010 17:20:28

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

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

1
22.10.2010 17:31:14

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

TOP (Transact-SQL)

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

SET ROWCOUNT (Transact-SQL)

введите описание изображения здесьВажный

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

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

0
16.09.2013 03:52:43