2016-05-18 3 views
-2

Я использую следующий запрос. Но он просто переносит верхние 1000 строк, вот и все. Хотя у меня больше строк. Если я удалю пункт where not exists, я получу полные данные. Можете ли вы сообщить мне, где я ошибаюсь?Query inserting only top 100 rows

DECLARE @BatchSize INT = 1000 
DECLARE @Counter INT = 0 
DECLARE @TableCount INT = 0 
set @TableCount = (select count(*) from Table2) 

while @Counter < (@TableCount/@BatchSize+1) 
BEGIN 

    INSERT INTO Table1 
    SELECT * FROM Table2 MH 
    inner join Table3 M 
    on MH.Mid = M.Mid 
    WHERE NOT EXISTS ( 
     SELECT * FROM Table1 
     where MH.otherid = M.otherid 
    ) 
    order by id OFFSET (@BatchSize * @Counter)ROWS FETCH NEXT @Batchsize ROWS ONLY; 
    SET @[email protected]+1 

END 

Почему это просто вставка 1000 строк?

+0

И * почему * вы выполняете запрос таким образом? Почему бы просто не выполнить полный запрос за один раз? –

+0

Поскольку вопрос, который стоит «почему он просто вставляет первые 1000 строк», больше не действует из-за простой ошибки (исходная форма предложения 'WHERE NOT EXISTS'), тогда я голосую, чтобы закрыть этот вопрос. –

+0

У меня есть миллионы данных, и я не хочу блокировать полную таблицу. –

ответ

0
WHERE NOT EXISTS ( 
    SELECT 1 FROM Table1 
) 

будет оцениваться только для первой партии вставок. После этого в целевой таблице есть записи, предложение WHERE оценивается как false, поэтому никаких дополнительных вставок не происходит.

+0

Я обновил запрос. Теперь я просто получаю каждый чередующийся 1000 строк. –

+0

Пожалуйста, не меняйте вопрос, как вы идете. Это приводит к недействительности некоторых предыдущих ответов. –

+0

Вопрос по-прежнему остается в том, что я не получаю все строки, он либо получает верхнюю, либо половину строк. –

0

Сколько строк в таблице2? Ваш второй цикл будет генерировать условие WHILE (1 < (TableCount/1001), если вы подсчитаете количество таблиц более 1001, оно выскочит после первого цикла.

+0

Ahhh, это может быть проблемой, но мне также нравится ответ @ Eric J.; хорошая точка зрения! –

+0

Я обновил запрос. Теперь я просто получаю каждый чередующийся 1000 строк. –

+1

Пожалуйста, не отправляйте задание на перемещение. Если вы не продумали или не экспериментировали достаточно, чтобы точно знать, что нужно просить, сделайте это сначала, а затем опубликуйте свой вопрос и ждите ответов. Если в этот момент вы найдете другие вещи, с которыми можно поэкспериментировать, сделайте это, а затем вернитесь и отправьте * новый * вопрос. Не редактируйте вопрос таким образом, чтобы текущие ответы были аннулированы. На ваш вопрос был дан ответ. Это должно быть так. Если вы чувствуете, что это будет загрязнять SO с большим количеством подобных вопросов, то это хорошо, это означает, что вы недостаточно работали с вопросом. Сделайте это первым. –

0
DECLARE @BatchSize INT = 1000 
DECLARE @Counter INT = 0 
--DECLARE @TableCount INT = 0 
--set @TableCount = (select count(*) from Table2) 
declare @rows int = 1 
while @rows>[email protected] < (@TableCount/@BatchSize+1) 
BEGIN 

    INSERT INTO Table1 
    SELECT * FROM Table2 MH 
    inner join Table3 M 
    on MH.Mid = M.Mid 
    --if you want non-existing 
    left join table1 t on t.field = M.field 
    where t.field is null 
    -- end if you want 
    --WHERE NOT EXISTS ( --not exists WHAT? 
    -- SELECT 1 FROM Table1 
    --) 
    order by id OFFSET (@BatchSize * @Counter) ROWS FETCH NEXT @Batchsize ROWS ONLY; 
    --SET @[email protected]+1 
    select @rows = @@rowcount, @counter = @counter + 1 
END