Запрос не работает нормально во время цикла

У меня есть цикл while, куда я пытаюсь вставить.

<code>              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
</code>

Моя таблица TempClub всегда проверяет только первые 100 записей. Моя таблица TempClub имеет 3000 записей. Мне нужно проверить всю мою клубную карту, все 3000 записей с таблицами ClubTransaction_121, ClubTransaction_120, ClubTransaction_119.

Ответы на вопрос(2)

необходимо установить для @MinClubcardID последний обработанный идентификатор плюс 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

SELECT запрос в строке 8 возвращает только первые 100 элементов

Если вы хотите получить все элементы, удалитеtop (100) часть вашего заявления

SELECT clubcard from TempClub ...
 happysmile14 апр. 2012 г., 13:04
я делаю пакетную вставку данных, поэтому я хочу извлечь топ-100, а затем повторять процесс, пока я не закончу все записи
 14 апр. 2012 г., 12:57
Мои глаза наткнулись на это тоже. Там вы ищете что-то сложное и ...
 15 апр. 2012 г., 13:51
Ааа, провал понимания с нашей стороны. Просто подумал, что вы на английском немного чушь. Является ли ответ от @Chris приемлемым, или он тоже не получил?

Ваш ответ на вопрос