2011-03-29 4 views
1

try catch를 사용하여 SQL Server에 저장 프로 시저가 있습니다. 내가 캐치 루프에하고 싶은과 같이, 모든 오류 변수 로그인하는 내 자신의 저장 프로 시저를 호출하는 것입니다 :캐치에서 로그 저장 프로 시저로 오류 정보 전달

BEGIN TRY 
    -- Generate a divide-by-zero error. 
    SELECT 1/0; 
END TRY 
BEGIN CATCH 
    exec log.LogError ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_MESSAGE(); 
END CATCH; 

나는이 프로그램을 실행할 때 나는 괄호에 오류가 발생합니다.

나는 실행할 수 있습니다

select ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_MESSAGE(); 

을 나는 또한

print ERROR_NUMBER() 

는 내가하고 싶은 것은 내가 이것을해야합니다 때문에 매개 변수를 사용하여 저장 프로 시저를 호출되어이 하나 개의 라인 할 수 많은 저장 프로 시저에서 try-catch가있는 각 저장 프로 시저에서 오류 매개 변수를 설정하는 코드를 많이 갖고 싶지는 않습니다.

아무도 다른 저장 프로 시저로 전달할 수있는 방법을 알고 있습니까? 이 ERROR_NUMBER() 직접 다른 오류 기능에 액세스 할 수 있도록

안부, 요한

답변

1

은 log.LogError 절차를 변경해보십시오. documentation에 예가 있습니다.

+0

감사합니다. - 내 문제가 해결됩니다. – gugguson

2

불행히도 T-SQL은 DRY 코드 재사용 컴팩트 구문 프로그래머 친화적 인 언어가 아닙니다. 당신은 어려운 방식으로해야하고, 그것은 각 CATCH 블록 안에 최소 4-5 줄의 코드를 작성하는 것을 의미합니다. 게다가 트랜잭션 의미론도 고려해야합니다 : 트랜잭션이 롤백 되었습니까? 또는 더 나쁜, 당신은 운명의 거래에 있습니까?

create procedure [usp_my_procedure_name] 
as 
begin 
    set nocount on; 
    declare @trancount int; 
    set @trancount = @@trancount; 
    begin try 
     if @trancount = 0 
      begin transaction 
     else 
      save transaction usp_my_procedure_name; 

     -- Do the actual work here 

lbexit: 
     if @trancount = 0 
      commit; 
    end try 
    begin catch 
     declare @error int, @message varchar(4000), @xstate int; 
     select @error = ERROR_NUMBER() 
        , @message = ERROR_MESSAGE() 
        , @xstate = XACT_STATE(); 
     if @xstate = -1 
      rollback; 
     if @xstate = 1 and @trancount = 0 
      rollback 
     if @xstate = 1 and @trancount > 0 
      rollback transaction usp_my_procedure_name; 

     raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ; 
     return; 
    end catch 
end 

은 더 이상 당신이 찾고있는 것보다 그것을인가 :이 T-SQL error handling template을 만든 이유? 나는 내기했다. 맞습니까? 예.

그리고 마지막으로 트랜잭션 환경에서 어떻게 로깅을 처리합니까? 로그 테이블에 삽입 된 내용은 오류 발생시 다른 모든 항목과 함께 롤백됩니다. 때로는 괜찮아요, 다른 시간조차도 원하지만 때로는 문제가 있습니다. 가장 흥미로운 솔루션 중 하나는 Simon Sabin의 Logging messages during a transaction입니다.

관련 문제