2016-05-16 937 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來保證循環的一致性。 –