Вопрос по sql-server-2005, tsql, sql – Запрос не работает нормально во время цикла

1

У меня есть цикл 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   ответа
1

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

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

SELECT clubcard from TempClub ...
Мои глаза наткнулись на это тоже. Там вы ищете что-то сложное и ...
Ааа, провал понимания с нашей стороны. Просто подумал, что вы на английском немного чушь. Является ли ответ от @Chris приемлемым, или он тоже не получил?
я делаю пакетную вставку данных, поэтому я хочу извлечь топ-100, а затем повторять процесс, пока я не закончу все записи happysmile
1

необходимо установить для @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

Похожие вопросы