2016-05-16 5 views
0

私はwhere句でレコードをループ処理しようとしています。私は最初の100行を先頭取得し、しようとしていますSQLでwhileループを使用する

その後、最初の100行が結果を返さない場合は、

しかし、次の100(私はselect句で何を得るに適用されるいくつかのロジック)、それを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

SELECT句にTOP @BatchSizeの代わりに、OFFSET @BatchSize * @Counter FETCH NEXT @Batchsize ROWS ONLYをWHERE句の後に入力してください。

コメントに基づいて、SELECT INTOクエリとnolockクエリヒントを調べることもできます。

+0

質問を編集しました。ここでどのようにオフセットを使用する必要がありますか教えてください。またはに選択? –

+0

OFFSETのORDER BYは必要ありませんか? – JamieD77

+0

@ JamieD77はい、ループの一貫性を保証するにはORDER BYが必要です。 –

関連する問題