2008-09-17 2 views
4

C#에서는 전달 된 내부 예외를 사용하여 원래 오류를 확인하고 실행 경로 (스택 추적)를 추적 할 수 있습니다. SQL Server 2005에서 try/catch 처리 오류를 사용하여 중첩 된 2 또는 3 수준의 중첩 된 저장 프로 시저에 오류가 발생할 때 어떻게 이것이 달성되는지 알고 싶습니다.Sql Server 2005 오류 처리 - 내부 예외

ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_SEVERITY() 같은 함수를 최상위 레벨의 저장된 proc이 액세스 할 수 있도록 줄 위로 쉽게 전달할 수 있기를 바랍니다.

+0

무엇이 문제입니까? – Sklivvz

+0

중첩 된 2 또는 3 수준의 중첩 된 저장 프로 시저에서 오류가 발생하면 SQL Server 2005에서 try/catch 처리 오류를 사용하여이 작업을 수행하는 방법을 알고 싶습니다. – HAdes

답변

0

한 가지 방법은 메모리 테이블을 만들고 예외를 잡을 때 행을 삽입하는 것입니다. 그런 다음 예외를 다시 발생시키고 체인의 다음 함수는 예외를 처리하거나 예외를 메모리 테이블에 기록 할 수 있습니다. 그것은 불쾌하지만 불행히도 T-SQL 호출 스택을 얻는 방법이없는 것 같습니다 : (

4

이 문제를 해결하는 가장 좋은 방법은 OUTPUT 매개 변수와 XML을 사용하는 것입니다. . 당신은 더 나은 오류로 응답을 처리하기 위해 TopProcedure에서 XML로 무엇을 수정할 수 있습니다

USE tempdb 
go 
CREATE PROCEDURE SubProcedure @RandomNumber int, @XMLErrors XML OUTPUT 
AS 
BEGIN 
BEGIN TRY 
    IF @RandomNumber > 50 
     RaisError('Bad number set!',16,1) 
    else 
     select @RandomNumber 
END TRY 
BEGIN CATCH 
    SET @XMLErrors = (SELECT * FROM (SELECT ERROR_MESSAGE() ErrorMessage, 
     ERROR_LINE() ErrorLine, ERROR_PROCEDURE() ErrorProcedure, 
     ERROR_SEVERITY() ErrorSeverity) a FOR XML AUTO, ELEMENTS, ROOT('root')) 
END CATCH 
END 
go 

CREATE PROCEDURE TopProcedure @RandomNumber int 
AS 
BEGIN 
    declare @XMLErrors XML 
    exec SubProcedure @RandomNumber, @XMLErrors OUTPUT 
    IF @XMLErrors IS NOT NULL 
     select @XMLErrors 
END 

go 
exec TopProcedure 25 
go 
exec TopProcedure 55 
go 
DROP PROCEDURE TopProcedure 
GO 
DROP PROCEDURE SubProcedure 
GO 

TopProcedure에 대한 초기 호출 (25)를 반환합니다 두 번째는이처럼 보이는 XML 블록을 반환합니다

<root> 
    <a> 
    <ErrorMessage>Bad number set!</ErrorMessage> 
    <ErrorLine>6</ErrorLine> 
    <ErrorProcedure>SubProcedure</ErrorProcedure> 
    <ErrorSeverity>16</ErrorSeverity> 
    </a> 
</root> 

Enjoy