2011-09-18 2 views
0

저장 프로 시저가 10 개 있습니다. 예를 들어저장 프로 시저 및 오류 처리

-

  • 저장 프로 시저는 테이블에서

다음 저장 프로 시저의 실행을 행을 인출 한 후 세 번째 ...

어떻게 오류이에 처리 할 수 ​​있습니다. 예를 들어 첫 번째 저장 프로 시저가 성공적으로 실행되면 두 번째 실행 오류가 있는지 확인해야합니다. 두 번째 실행이 성공적으로 수행되면 두 번째 저장 프로 시저가 성공적으로 실행되고 그렇지 않으면 세 번째 실행 오류가 발생합니다.

ALTER PROCEDURE [dbo].[MASTER_PROCEDURE] AS 
EXEC QRY_STEP3 
EXEC QRY_STEP_3_1_1 
EXEC OQRY_STEP_3_1_1 
+0

저장 프로 시저는 무엇을 반환합니까? 예를 들어 결과 집합에서 @@ Rowcount를 검사하고 0 인 경우 프로 시저가 오류라고 가정합니다. 사용중인 SQL의 버전에 따라 TRY Catch를 사용할 수도 있습니다. SQL 버전 번호와 각 프로 시저가 수행하거나 리턴하는 작업에 대한 일반적인 아이디어를 제공 할 수 있습니까? – Sparky

+0

그들은 임시 테이블을 만들고 첫 번째 저장 프로 시저에서 생성 된 임시 테이블은 두 번째 저장 프로 시저에서 사용됩니다. – CPDS

+0

후속 절차를 호출하기 전에 임시 테이블이 있는지 확인할 수 있습니다. 여러 가지 방법으로 어떤 버전의 SQL을 사용하고 있습니까 (예 : SELECT @@ VERSION을 실행하고 결과를 확인하십시오). – Sparky

답변

0

사용 @@ 오류 .. 나는 그들이 성공 여부를 여부를 확인하기 위해 저장 프로 시저 지사의 각 로직을 추가 할이

ALTER PROCEDURE [dbo].[MASTER_PROCEDURE] AS 

EXEC QRY_STEP3 

IF @@error =0 

begin 

EXEC QRY_STEP_3_1_1 

else 

begin 

print "error in proc name" 

return 1 

End 

if (@@error=0) 

Begin 

EXEC OQRY_STEP_3_1_1 

Else 

print "error in proc name" 

return 1 

End 

END 

END 
1

같이 수행 할 수 있습니다. 예를 들어 임시 테이블의 존재 여부를 테스트합니다. 그런 다음 반환 값을 사용하여 proc의 성공을 나타냅니다. 일반적으로이 값은 succes의 경우 0이며 실패 할 경우 0이 아닙니다.

그런 다음 마스터 PROC 나던 각 자식 시저의 내부 동작에 대해 알아야 할,이 방법을 사용하여이

DECLARE @ReturnValue INT 

EXEC @ReturnValue = QRY_STEP1 

IF(@ReturnValue = 0) 
BEGIN 
    EXEC @ReturnValue = QRY_STEP2 
END 
ELSE 
BEGIN 
    --REPORT ERROR 
END 

처럼 마스터 시저에서 발동를 호출 할 것이고, 마스터 시저 코드가 될 것입니다 더 깔끔하고 읽기 쉽습니다.

0

먼저 올바르게 수행하려면 하위 패키지에 TRY CATCH 블록을 사용해야합니다. 오류가 있으면 호출 한 proc로 리턴해야합니다. 이 방법을 사용하면 오류가 아니지만 후속 procs가 실패 할 수있는 0 레코드가있는 임시 테이블과 같이 결과가 예기치 않은 경우 오류 코드를 호출하는 proc에 반환 할 수도 있습니다.

다음으로 왜 자식 프록을 전혀 사용하지 않습니까? 솔직히 말해서 이것은 아마도 하나의 proc에서 더 잘 수행 될 것입니다. 예를 들어, 하나의 proc에 임시 테이블을 작성하여 후속 procs에 사용한다고 가정 해보십시오. 이렇게하려면 전역 임시 테이블이 필요합니다. 문제는 전역 임시 테이블이 데이터를 호출 한 원래 연결과 관련이 없으므로이 두 데이터를 동시에 처리하려고하는 두 사람이 데이터가 겹쳐서 표시 될 수 있다는 것입니다. 반면에 일어날 수없는 proc 및 로컬 임시 테이블을 사용하는 경우.