2010-06-09 8 views
1

저장 프로 시저를 반복적으로 실행해야하는 상황이 발생했습니다. 이제이 프로 시저 (spMAIN)에는 T1에서 테이블 값을 찾는 내부 구조가 있습니다.반복적으로 저장 프로 시저 실행

ID  Status 
---- -------- 
1  New 
2  New 
3  success 
4  Error 

이제 커서의 상태로 모든 행을 찾습니다 '새'

이제 동안 처리, 커서의 인스턴스에 오류가 발생하는 경우, 다른 SP는 spError는 '상태'라고해야 할 말 T1의 열을 'Error'로 업데이트하고 spMAIN을 다시 호출하여 프로세스를 반복하고 행을 찾습니다. 'new'포함

어떻게해야합니까? 또한 SP에 다른 SP가 있고 SP에서 오류가 발생하면 동일한 작업을 수행해야하며 T1 테이블을 업데이트해야합니다 ('오류'). spMAIN을 다시 호출해야합니다.

도 추천 할만한 제품이 있습니까? 여기

당신은 오류가 당신이하는 것이 좋습니다 것입니다 SQL 서버 2005로 시작하는 SQL 서버에 내장 년대 TRY 캐치 기능을 취급 수행 할 수

ALTER PROC zzSpMain 
AS 
    BEGIN 
     DECLARE @id INT 
     BEGIN TRY 
     IF EXISTS (SELECT * 
        FROM  dbo.zzTest 
        WHERE istatus = 'new') 
      BEGIN 


       DECLARE c CURSOR 
        FOR SELECT id 
         FROM zztest 
         WHERE istatus = 'new' 

       OPEN c 
       FETCH NEXT FROM c INTO @id 

       WHILE @@FETCH_STATUS = 0 
        BEGIN 
        PRINT @id 


        IF @id = 2 
         BEGIN   
          UPDATE zztest 
          SET  istatus = 'error' 
          WHERE id = @id 
          RAISERROR ('Error occured', 16, 
           1) 
         END 

        UPDATE zztest 
        SET  istatus = 'processed' 
        WHERE id = @id 

        FETCH NEXT FROM c INTO @id 
        END 
       CLOSE c 
       DEALLOCATE c 

      END 

     END TRY 
     begin CATCH 

     EXEC zzSpError 
     END CATCH 

    END 
+4

내가 필요한 것을 할 수있는 더 좋은, 더 RDBMS - 설정 - 스타일의 방법이 일반적으로 확신 커서를 볼 때마다. – Joe

답변

2

일부 코드의 쿼리 논리를 다시 평가하고보고 SQL CLR 또는 MERGE 문과 같은 항목. 샘플 코드로 판단 할 때이 방법은 특히 쉬운 방법입니다.

2

이 모든 프레임 워크는 훌륭하게 보입니다. 따라서 중첩 된 SP가 많은 경우 TRY/CATCH 및 재실행 문제가 무엇인지 잘 모르겠습니다.

그러나, 세트 기반 방식이 바람직하다. 요구 사항을 더 많이 줄 수 있다면 더 쉽게 제안 할 수 있습니다. 일반적으로 폴링 유형 시나리오의 경우 일반적으로 전체 행 세트 (커서 포함)에서 작동하는 에이전트 작업을 사용하거나 배치 번호를 할당하고 해당 배치의 처리를 시작할 수 있습니다. 에이전트 작업이 다음에 트리거 될 때 일괄 처리가없는 새 행에만 다른 일괄 처리가 지정되고 처리가 취소됩니다.

하지만 당신의 기본 동기 부여에 대한 자세한 내용을 모르고

...