2008-08-18 2 views
2

장면을 상상해보십시오. 레거시 Sybase 코드를 업데이트하고 커서를 발견했습니다. 스토어드 프로시 저는 #temporary 테이블에 결과 세트를 작성합니다. #temporary 테이블은 열의 하나가 인간이 읽을 수있는 것이 아니라는 것을 제외하면 모두 반환 될 준비가되어 있습니다. 영숫자 코드입니다.Sybase (T-SQL)에서 커서 사용을 피하는 방법은 무엇입니까?

declare c_lookup_codes for 
select distinct lookup_code 
from #workinprogress 

while(1=1) 
begin 
    fetch c_lookup_codes into @lookup_code 

    if @@sqlstatus<>0 
    begin 
     break 
    end 

    exec proc_code_xref @lookup_code @xref_code OUTPUT 

    update #workinprogress 
    set xref = @xref_code 
    where lookup_code = @lookup_code 
end 

: 우리가해야 할 일은

는 새로 해독 값으로 설정 한 결과를 업데이트 한 후 참조에게이 신중한 값을 건너 또 다른 저장 프로 시저를 호출,이 코드의 가능한 고유 한 값을 파악하고있다 이제는 이것이 사람들의 두근 두근 두근 거림을 줄 수 있지만 작동합니다. 제 질문은 이런 종류의 일을 피하는 것이 가장 좋습니다.

_NB : 결과 세트가 500k 행의 영역에 있고 look_up_code에 100 개의 고유 한 값이 있다고 가정 할 수도 있고 마지막으로 look_up_code에 100 개의 고유 한 값이 있다고 생각할 수도 있습니다. proc_code_xref의 논리로 xref 값이 너무 작습니다. _

답변

1

커서를 꺼내려면 XRef 테이블이 있어야합니다. 100 개의 별개의 룩업 값을 알고 있다고 가정하면 (그것들은 고정되어 있습니다), proc_code_xref를 100 번 호출하여 결과를 테이블에 삽입하면 간단합니다.

1

xref proc에서 코드를 복제하지 않는 한 커서 사용을 피할 방법이 없습니다.

0

그들은 커서를 사용해야 만한다면, 뭔가 잘못 했음에 틀림 없어 ;-) 커서가없는 해결책 :

declare @lookup_code char(8) 

select distinct lookup_code 
into #lookup_codes 
from #workinprogress 

while 1=1 
begin 
    select @lookup_code = lookup_code from #lookup_codes 

    if @@rowcount = 0 break 

    exec proc_code_xref @lookup_code @xref_code OUTPUT 

    delete #lookup_codes 
    where lookup_code = @lookup_code 
end 
관련 문제