2016-05-16 939 views
0

我想通过where子句循环访问我的记录。在sql中使用while循环

我想只得到第一个顶部100行,然后下一个100(一些逻辑我申请与我在SELECT子句中获得)

但是,如果第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

而不是在SELECT子句中的TOP @BatchSize,在WHERE子句之后尝试OFFSET @BatchSize * @Counter FETCH NEXT @Batchsize ROWS ONLY

根据评论,您可能还需要查看SELECT INTO查询以及nolock查询提示。

+0

我编辑了这个问题,你能让我知道我应该如何在这里使用OFFSET?或者选择进入? –

+0

你不需要ORDER BY for OFFSET吗? – JamieD77

+0

@ JamieD77是的,但是您还需要一个ORDER BY来保证循环的一致性。 –