2012-04-14 14 views
1

私は挿入しようとしているWhileループを持っています。whileループで正常に動作しないクエリ

   DECLARE @CurrentOffer int =121 
     DECLARE @OldestOffer int = 115 
     DECLARE @MinClubcardID bigint=0 
       DECLARE @MaxClubcardID bigint=1000 
        WHILE 1 = 1 
         BEGIN 
         INSERT INTO Temp WITH (TABLOCK) 
         SELECT top (100) clubcard from TempClub with (nolock) where ID between 
         @MinClubcardand and @MaxClubcard 

         declare @sql varchar (8000) 
         while @OldestOffer <= @CurrentOffer 
         begin 
         print @CurrentOffer 
         print @OldestOffer 

           set @sql = 'delete from Temp where Clubcard 
           in (select Clubcard from ClubTransaction_'+convert(varchar,@CurrentOffer)+' with (nolock))' 
           print (@sql) 
           exec (@sql) 

           SET @CurrentOffer = @CurrentOffer-1 
           IF @OldestOffer = @CurrentOffer 
            begin 

             -- my logic 
            end 

         end 
        end 

私のTempClubテーブルは常に最初の100個のレコードのみをチェックします。私のTempClubテーブルには3000レコードあります。 ClubTransaction_121、ClubTransaction_120、ClubTransaction_119のテーブルを使って、すべての私のクラブカードを3000レコードすべてをチェックする必要があります。

答えて

1

ラインでSELECTクエリ8返しますのみ上位100アイテム

SELECT top (100) clubcard from TempClub ... 

あなたはすべてのアイテムを取得したい場合は、バッチを実行するためには、あなたの文

SELECT clubcard from TempClub ... 
+0

私の目はあまりにもつまずきました。あなたは何か複雑なものを探しています... –

+0

私はバッチ賢明なデータを挿入しているので、私はトップ100を抽出し、すべてのレコードを終了するまでプロセスを繰り返す。 – happysmile

+0

ああ、われわれの部分では理解できない。ちょうどあなたがアンレルがちょっとしたと思った。 @Chrisからの答えは受け入れられるのですか、彼はそれを手に入れませんでしたか? –

1

top (100)一部を削除@MinClubcardIDを最後に処理したIDに1を加えたものに設定し、レコードが順番に返されるようにORDER BY IDを含める必要があります。

しかし、私は "インデックス"としてプライマリキーを使用するアプローチを使用しません。あなたが探しているのは、基本的なページ区切りのパターンです。 SQL Server 2005以降、マイクロソフトでは、ページ番号付けをもっと簡単にするrow_number()関数を導入しました。

例えば:

DECLARE @T TABLE (clubcard INT) 

DECLARE @start INT 
SET @start = 0 

WHILE(1=1) 
BEGIN 
    INSERT @T (clubcard) 
    SELECT TOP 100 clubcard FROM 
    (
     SELECT clubcard, 
     ROW_NUMBER() OVER (ORDER BY ID) AS num 
     FROM dbo.TempClub 
    ) AS t 
    WHERE num > @start 

    IF(@@ROWCOUNT = 0) BREAK; 

    -- update counter 
    SET @start = @start + 100 

    -- process records found 

    -- make sure temp table is empty 
    DELETE FROM @T 
END 
関連する問題