2014-11-06 5 views
0

나는 MS의 SQL 서버에 루프에서이while 루프를 사용하여 테이블에서 데이터를 가져 오는 방법은 무엇입니까?

BEGIN TRANSACTION 
WHILE(@first <= @last) 
BEGIN 

Select @LineOfAuthorityNameSubString = TempLineOfAuthority from #tbTempLineOfAuthority; 

Select @tbLineOfAuthorityId = LineOfAuthority 
from tbLineOfAuthority where LineOfAuthorityX = @LineOfAuthorityNameSubString; 

INSERT INTO tbProductLineOfAuthority(ProductId, LineOfAuthortyId) 
VALUES(@tbProductId, @tbLineOfAuthorityId); 

SET @first += @step 
END 
COMMIT TRANSACTION 

이제 문제는 코드

Select @tbLineOfAuthorityId = LineOfAuthority 
    from tbLineOfAuthority where LineOfAuthorityX = @LineOfAuthorityNameSubString; 

변수 @tbLineOfAuthorityId이 같은 점점이 라인에 같은 2008 뭔가를 저장 프로 시저를 작성했습니다 루프의 모든 시간 값. 도와주세요!

+3

를? 그냥 하나의 삽입으로 선택 사용 그게 전부 야. – Darka

+0

너의 대구 e는 루프의 각 루프에 대해 동일한'@ tbProductId' 및 @ tbLindeOfAuthorityId를 삽입합니다. 이는 의도 한 동작입니까? –

+0

'@ first','@ last' 및'@step'은 루프 본문에서 사용되지 않고 반복적으로 만 본문을 실행할 수 있습니다. 루프 본문에있는 어떤 것도'@ tbLineOfAuthorityId' 값으로 설정되지 않으므로 항상 같은 값이됩니다. – Jodrell

답변

0

루프를 사용하여 테이블에서 데이터를 가져 오려면 CURSOR을 사용하십시오.

내가 먼저 고려하는 순간에 더 자세히 설명하지만 것,

가장 커서 기반의 접근 방식은 다시 쓴보다 효율적으로 세트를 사용 할 수 있습니다. 당신은 예를 들어 SELECTINSERT를 사용하여 기반 쿼리를 설정하게 할 수있는 경우

이 매우 가능성이 더 좋은 옵션이 될 것입니다.

특정 문제에 대한 집합 기반 방법의 예는 Bernd Linde's answer을 참조하십시오. 귀하의 명시된 질문에 대한 정식 답변은 다음과 같습니다. 당신은 그러나 CURSOR을해야하는 경우, 여기에 몇 가지 지침입니다


, 읽기 전용 방식으로 데이터를 사용하고 처음부터 끝까지를 통해 스캔 것이기 때문에

, 당신이이 명시 적으로 만들 수 있습니다 정의에서. 커서가 READ ONLY이고 FORWARD_ONLYFAST_FORWARD 인수를 사용하므로 성능에 큰 차이가 있습니다.

커서는이 배치에만 사용되므로 LOCAL 인수로 선언해야합니다. 아무것도 항상을 얻을 것이다 의미 루프에서 첫 번째 선택 내부 변경하지 않기 때문에

코드는 당신이 @tbLineOfAuthorityId 전체 시간 동안 같은 값을 얻고있는 이유

-- Declare the cursor. 
DECLARE [someName] CURSOR LOCAL 
     FAST FORWARD 
FOR 
    SELECT 
      [Some], 
      [Other] 
     FROM 
      [SomeTable]; 

OPEN [someName]; 
BEGIN TRY 
    -- Declare variables for storing the row. 
    DECLARE @some INT; 
    DECLARE @other NVARCHAR(MAX); 

    -- Get the first row 
    FETCH NEXT FROM [someName] INT @some, @other; 

    -- Loop through all the rows 
    WHILE @@FTECH_STATUS = 0 BEGIN 
     -- Do something useful with @some and @other 

     -- Get the next row. 
     FETCH NEXT FROM [someName] INT @some, @other; 
    END 

END TRY 
BEGIN CATCH 
    -- Error Handling 
END CATCH 

-- Always close and de-allocate the cursor, once it is opened. 
CLOSE [someName]; 
DEALLOCATE [someName]; 
+0

나는 위의 코드를 얻지 못하고있다 ... 나에게 예제를 제공해 줄 수 있니? –

1

이유 같은 것을 보일 것입니다 루프가 실행될 때마다 동일한 결과가 @tbLineOfAuthorityId 변수에 저장됩니다.

으로는 @first, @last 당신이 언급하지 않은 @step, 전체 코드가 하나의 INSERT 문으로 대체 될 수를 사용하는 이유에 대한 요구 사항이없는 한, 다른 사람에 의해 코멘트 섹션에서 말했다 :

필요에 따라
insert into tbProductLineOfAuthority 
    (ProductId, 
     LineOfAuthortyId) 
select @tbProductId, 
     loa.LineOfAuthority 
    from tbLineOfAuthority loa 
     join 
     #tbTempLineOfAuthority tla on tla.TempLineOfAuthority = loa.LineOfAuthorityX 

그 문 (현재 질문 @step의 사용에 대한 추가 의미가 없다는 가정에 따라 모든 값을 삽입합니다. u는 여기에 루프를 사용하는 이유

+0

+1 나는 독자적으로 글을 쓰고 대답을 게시 한 다음, 이중성을 발견했다. – Jodrell

관련 문제