-3

重複の可能性:
while ループでクエリが正常に機能しない

挿入しようとしている WHILE ループがあります

DECLARE @CurrentOffer int  =121
DECLARE @OldestOffer int  = 115

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

ここで行っているのは、行をバッチでテーブルに挿入し、Tempテーブルに存在するかどうかを確認することですClubTransaction_121

終了する場合は、ここで削除する必要があります。私のループは最初の 100 クラブカードを取得しClubTransaction_121、チェックして次のオファーである 120 をチェックするために移動します。

しかし、私のテーブルには 3000 行あり、すべての行Tempを含むテーブルでチェックする必要があります。ClubTransaction_121

最初の 100 レコードのみをチェックし、次の ClubTransaction_120 でチェックに移動します。

すべてのクラブカードをチェックする必要が ありClubTransaction_121ます。ClubTransaction_120ClubTransaction_119

4

1 に答える 1

0

まず、データの一貫性が失われる可能性があるため、TABLOCKとNOLOCKを削除することをお勧めします。

次に、ループの各反復で、トランザクションを開始してトランザクションをコミットします。各ステップが完了した場合は正常であると見なされ、10回のループが完了し、11回目の失敗が発生した場合は、トランザクション全体をロールバックしなくてもかまいません。

このようなもの:

DECLARE @CurrentOffer int  =121
DECLARE @OldestOffer int  = 115

WHILE 1 = 1
BEGIN
    BEGIN TRANSACTION;
     INSERT INTO Temp 
        SELECT TOP (100) clubcard  
        FROM TempClub 
        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)

          print (@sql)
          exec (@sql)

          SET @CurrentOffer = @CurrentOffer-1  

          IF @OldestOffer = @CurrentOffer
          begin
             -- my logic
          end
     end
    COMMIT TRANSACTION;
END
于 2012-04-14T15:31:07.010 に答える