2016-05-16 3 views
0

Я пытаюсь пропустить мои записи с предложением where.Использование цикла while в sql

Я пытаюсь получить только топ 100 строк первой, а затем следующий 100 (какая-то логика я применять с тем, что я получаю в выбранном пункте)

Но, если первые 100 строк не возвращает результат, его не входит в 2-й 100 набор данных.

Мой запрос:

DECLARE @BatchSize INT = 100 
DECLARE @Counter INT = 0 
DECLARE @TableCount INT = 0 
set @TableCount = (select count(*) from Table1) //@TableCount = 10000 

while @Counter < @TableCount/@BatchSize //@Counter < 100 
BEGIN   
    SET @[email protected]+1 
    INSERT INTO Table4 
    SELECT TOP(@BatchSize) * FROM Table2 
    WHERE NOT EXISTS (SELECT * Table3) and some condition 

Здесь Если я не получаю данные за первые 100 строк, он не будет перейти к следующему 100 набора данных.

Что мне делать?

+0

Петли и SQL обычно являются признаком того, что вы не думаете с точки зрения наборов. Вы действительно хотите думать с точки зрения наборов. –

+0

Зачем вам это нужно? –

+0

@JoelCoehoorn Можете ли вы объяснить мне больше об этом. Я не понял, я делаю циклы, потому что у меня есть миллионы строк данных, и я не хочу блокировать всю таблицу. –

ответ

1

Вместо TOP @BatchSize в предложении SELECT попробуйте OFFSET @BatchSize * @Counter FETCH NEXT @Batchsize ROWS ONLY после предложения WHERE.

На основе комментариев вы также можете ознакомиться с запросом SELECT INTO, а также с подсказкой запроса nolock.

+0

Я отредактировал вопрос, Можете ли вы сообщить мне, как я должен использовать OFFSET здесь? Или выберите? –

+0

Вам не нужно ЗАКАЗАТЬ ДЛЯ СМЕЩЕНИЯ? – JamieD77

+0

@ JamieD77 Да, но вам нужен ORDER BY, чтобы гарантировать согласованность его цикла. –

Смежные вопросы