기술적으로 THROW
와 사이를 번갈아 가면서 가능하더라도 RAISERROR
실제로는 그렇게하고 싶지 않을 것입니다. 왜? 매개 변수가없는의 아주 멋진 능력 때문에 THROW
로 사용하여 오류를 재 - 던져 같은 메시지 번호 (예 : Msg 8134
대신의 Msg X
경우 X
> = 50000)이 그들 사이의 유일한 차이점되지 않습니다 : THROW
입니다 일괄 중단 동안은 RAISERROR
없습니다. 이것은 아래에 설명 된 중요한 동작 차이 일 수 있습니다.
테스트 설정
--DROP PROC ##Throw;
--DROP PROC ##RaisError;
GO
CREATE PROCEDURE ##Throw
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
THROW;
END CATCH;
SELECT 1 AS [AA];
GO
CREATE PROCEDURE ##RaisError
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
RAISERROR('test, yo!', 16, 1);
-- RETURN; -- typically at end of CATCH block when using RAISERROR
END CATCH;
SELECT 2 AS [BB];
GO
시험 1
EXEC ##Throw;
SELECT 3 AS [CC];
보고:
"Results" Tab:
DivideByZero
{empty result set}
"Messages" Tab:
Msg 8134, Level 16, State 1, Procedure ##Throw, Line 38
Divide by zero error encountered.
시험 2
EXEC ##RaisError;
SELECT 4 AS [DD];
보고:
"Results" Tab:
DivideByZero
{empty result set}
BB
2
DD
4
"Messages" Tab:
Msg 50000, Level 16, State 1, Procedure ##RaisError, Line 45
test, yo!
공정하게하기 위해 다음을 수행하여이 차이를 숨길 수 있습니다.
- 항상 구조
THROW
내에서 사용하여 코드에 대한 모든 호출을 래핑하십시오 TRY...CATCH
(아래에 설명).
- 결코 장소 코드 후
THROW
(물론,를 제외하고 END CATCH;
)
시험 3
BEGIN TRY
EXEC ##Throw;
SELECT 5 AS [EE];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 6 AS [FF];
GO
보고:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
8134 Divide by zero error encountered.
FF
6
시험 4
BEGIN TRY
EXEC ##RaisError;
SELECT 7 AS [GG];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 8 AS [HH];
GO
보고:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
50000 test, yo!
HH
8