RAISERROR 사용

RAISERROR는 SQL Server 데이터베이스 엔진에서 생성되는 시스템 오류나 경고 메시지와 같은 형식을 사용하여 응용 프로그램에 메시지를 다시 반환하는 데 사용됩니다.

RAISERROR는 다음을 반환할 수 있습니다.

  • sp_addmessage 시스템 저장 프로시저를 사용하여 생성된 사용자 정의 오류 메시지. 메시지 번호가 50000보다 큰 메시지가 여기에 해당하며 이러한 메시지는 sys.messages 카탈로그 뷰에서 볼 수 있습니다.

  • RAISERROR 문에 지정된 메시지 문자열

RAISERROR는 다음 작업도 수행할 수 있습니다.

  • 특정 오류 번호, 심각도, 상태 할당

  • 데이터베이스 엔진 오류 로그와 Microsoft Windows 응용 프로그램 로그에 오류가 기록되도록 요청

  • C 언어 printf_s 함수와 매우 유사한 메시지 텍스트로 인수 값 대체

RAISERROR와 PRINT 모두 응용 프로그램에 정보 메시지나 경고 메시지를 반환하는 데 사용할 수 있습니다. RAISERROR에서 반환하는 메시지 텍스트는 C 표준 라이브러리의 printf_s 함수와 유사한 문자열 대체 기능을 사용하여 작성할 수 있습니다. 그러나 PRINT는 문자열이나 문자 식만 반환할 수 있습니다. TRY…CATCH 구문의 TRY 블록에서 심각도 11-19로 RAISERROR를 실행하면 관련 CATCH 블록으로 제어가 전달됩니다. CATCH 블록을 호출하지 않고 RAISERROR를 사용하여 메시지를 반환하려면 심각도를 10 이하로 지정합니다. PRINT는 CATCH 블록으로 제어를 전달하지 않습니다.

sys.messages에 있는 사용자 정의 메시지의 msg_id를 RAISERROR에 사용하면 msg_id가 SQL Server 오류 번호나 원시 오류 코드로 반환됩니다. msg_id 대신 msg_str을 RAISERROR에 사용하면 반환되는 SQL Server 오류 번호와 원시 오류 번호는 50000입니다.

RAISERROR를 사용하여 사용자 정의 오류 메시지를 반환할 경우 해당 오류를 참조하는 각 RAISERROR에 다른 상태 번호를 사용합니다. 이렇게 하면 발생하는 오류를 진단하는 데 도움이 됩니다.

RAISERROR를 사용하여 다음 작업을 수행할 수 있습니다.

  • Transact-SQL 코드 문제 해결 지원

  • 데이터 값 확인

  • 변수 텍스트가 포함된 메시지 반환

  • TRY 블록에서 관련 CATCH 블록으로 실행 이동

  • CATCH 블록에서 호출 배치나 응용 프로그램으로 오류 정보 반환

다음 예에서는 응용 프로그램에 반환되는 메시지에서 DB_ID() 및 DB_NAME() 함수의 값을 대체합니다.

DECLARE @DBID INT;
SET @DBID = DB_ID();

DECLARE @DBNAME NVARCHAR(128);
SET @DBNAME = DB_NAME();

RAISERROR
    (N'The current database ID is:%d, the database name is: %s.',
    10, -- Severity.
    1, -- State.
    @DBID, -- First substitution argument.
    @DBNAME); -- Second substitution argument.
GO

다음 예에서는 사용자 정의 메시지를 사용하여 같은 정보를 제공합니다.

EXECUTE sp_dropmessage 50005;
GO
EXECUTE sp_addmessage 50005, -- Message id number.
    10, -- Severity.
    N'The current database ID is: %d, the database name is: %s.';
GO
DECLARE @DBID INT;
SET @DBID = DB_ID();

DECLARE @DBNAME NVARCHAR(128);
SET @DBNAME = DB_NAME();

RAISERROR (50005,
    10, -- Severity.
    1, -- State.
    @DBID, -- First substitution argument.
    @DBNAME); -- Second substitution argument.
GO

다음 코드 예제에서는 TRY 블록 내에 RAISERROR를 사용하여 실행을 관련 CATCH 블록으로 이동하는 방법을 보여 줍니다. 또한 RAISERROR를 사용하여 CATCH 블록을 호출한 오류에 대한 정보를 반환하는 방법을 보여 줍니다.

[!참고]

RAISERROR는 1에서 127까지 상태의 오류만 생성할 수 있습니다. 데이터베이스 엔진은 상태 0의 오류를 발생시킬 수 있으므로 RAISERROR의 상태 매개 변수 값으로 전달하기 전에 ERROR_STATE에서 반환된 오류 상태를 확인하는 것이 좋습니다.

BEGIN TRY
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block
    RAISERROR ('Error raised in TRY block.', -- Message text.
               16, -- Severity.
               1 -- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT @ErrorMessage = ERROR_MESSAGE(),
           @ErrorSeverity = ERROR_SEVERITY(),
           @ErrorState = ERROR_STATE();

    -- Use RAISERROR inside the CATCH block to return 
    -- error information about the original error that 
    -- caused execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;