1

挿入しようとしている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 レコードすべてチェックする必要があります。

4

2 に答える 2

1

8行目のSELECTクエリは、上位100個のアイテムのみを返します

SELECT top (100) clubcard from TempClub ...

すべてのアイテムを取得する場合top (100)は、ステートメントの一部を削除します

SELECT clubcard from TempClub ...
于 2012-04-14T10:51:57.413 に答える
1

バッチ タイプの処理を行うには、@MinClubcardID を最後に処理された ID に 1 を加えた値に設定し、ORDER BY ID を含めてレコードが順番に返されるようにする必要があります。

しかし...主キーを「インデックス」として使用するアプローチは使用しません。あなたが探しているのは、基本的なページネーション パターンです。SQL Server 2005 以降では、Microsoft は、ページネーションをより簡単にする 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
于 2012-04-14T14:56:10.410 に答える