다음을 통해 공유


THROW(Transact-SQL)

SQL Server 2012에서 예외를 발생시키고 TRY…CATCH 구문의 CATCH 블록으로 실행을 이전합니다.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

THROW [ { error_number | @local_variable },
        { message | @local_variable },
        { state | @local_variable } ] 
[ ; ]

인수

  • error_number
    예외를 나타내는 상수 또는 변수입니다. error_number는 int이며 50,000 이상 2,147,483,647 이하여야 합니다.

  • message
    예외를 설명하는 문자열 또는 변수입니다. message는 nvarchar(2048)입니다.

  • state
    메시지와 연결할 상태를 나타내는 0에서 255 사이의 상수 또는 변수입니다. state는 tinyint입니다.

주의

THROW 문 앞의 문 다음에는 세미콜론(;) 문 종결자를 붙여야 합니다.

TRY…CATCH 구문을 사용할 수 없으면 세션이 종료됩니다. 예외가 발생한 줄 번호와 프로시저가 설정됩니다. 심각도는 16으로 설정됩니다.

매개 변수 없이 지정된 THROW 문은 CATCH 블록 안에 나타나야 합니다. 이렇게 하면 예외가 발생합니다. THROW 문에 발생하는 오류로 인해 문 일괄 처리가 종료됩니다.

RAISERROR와 THROW의 차이점

다음 표에서는 RAISERROR 문과 THROW 문의 차이점을 보여 줍니다.

RAISERROR 문

THROW 문

msg_id 가 RAISERROR에 전달되는 경우 ID가 sys.messages에 정의되어야 합니다.

error_number 매개 변수는 sys.messages에 정의될 필요가 없습니다.

msg_str 매개 변수는 printf 서식 스타일을 포함할 수 있습니다.

message 매개 변수에는 printf 스타일 서식을 사용할 수 없습니다.

severity 매개 변수는 예외의 심각도를 지정합니다.

severity 매개 변수가 없습니다. 예외 심각도는 항상 16으로 설정됩니다.

1.THROW를 사용하여 예외 발생

다음 예에서는 THROW 문을 사용하여 예외를 발생시키는 방법을 보여 줍니다.

THROW 51000, 'The record does not exist.', 1;

결과 집합은 다음과 같습니다.

Msg 51000, Level 16, State 1, Line 1

The record does not exist.

2.THROW를 사용하여 다시 예외 발생

다음 예에서는 THROW 문을 사용하여 발생한 예외를 다시 발생시키는 방법을 보여 줍니다.

USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
(    ID INT PRIMARY KEY
);
BEGIN TRY
    INSERT dbo.TestRethrow(ID) VALUES(1);
--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.
    INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH

    PRINT 'In catch block.';
    THROW;
END CATCH;

결과 집합은 다음과 같습니다.

PRINT 'In catch block.';

Msg 2627, Level 14, State 1, Line 1

Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.

The statement has been terminated.

3.THROW에 FORMATMESSAGE 사용

다음 예에서는 FORMATMESSAGE 함수를 THROW와 함께 사용하여 사용자 지정된 오류 메시지를 발생시키는 방법을 보여 줍니다. 이 예제에서는 먼저 sp_addmessage를 사용하여 사용자 정의 오류 메시지를 만듭니다. THROW 문은 RAISERROR와 같은 방식으로 message 매개 변수에서 대체 매개 변수를 허용하지 않기 때문에 FORMATMESSAGE 함수를 사용하여 오류 메시지 60000에 필요한 3개의 매개 변수 값을 전달합니다.

EXEC sys.sp_addmessage
     @msgnum   = 60000
,@severity = 16
,@msgtext  = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).'
    ,@lang = 'us_english'; 
GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string'); 

THROW 60000, @msg, 1; 

결과 집합은 다음과 같습니다.

Msg 60000, Level 16, State 1, Line 2

This is a test message with one numeric parameter (500), one string parameter (First string), and another string parameter (second string).

참고 항목

참조

FORMATMESSAGE(Transact-SQL)

ERROR_LINE(Transact-SQL)

ERROR_MESSAGE(Transact-SQL)

ERROR_NUMBER(Transact-SQL)

ERROR_PROCEDURE(Transact-SQL)

ERROR_SEVERITY(Transact-SQL)

ERROR_STATE(Transact-SQL)

RAISERROR(Transact-SQL)

@@ERROR(Transact-SQL)

GOTO(Transact-SQL)

BEGIN...END(Transact-SQL)

XACT_STATE(Transact-SQL)

SET XACT_ABORT(Transact-SQL)

개념

데이터베이스 엔진 오류 심각도