2012-04-14 5 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 개의 레코드가 있습니다. 모든 Clubcard를 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

아, 이해가 안되는 부분입니다. 그냥 당신이 anglais가 조금 찌른다고 생각했습니다. @Chris의 답변이 받아 들여지지 않습니까, 아니면 받아 들여지지 않았습니까? –

1

을의 top (100) 부분을 제거 @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 
관련 문제