THROW(Transact-SQL)THROW (Transact-SQL)

적용 대상: 예SQL Server 예Azure SQL Database 예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL Server 2017SQL Server 2017에서 예외를 발생시키고 TRY...CATCH 구문의 CATCH 블록으로 실행을 이전합니다.Raises an exception and transfers execution to a CATCH block of a TRY...CATCH construct in SQL Server 2017SQL Server 2017.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

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

인수Arguments

error_numbererror_number
예외를 나타내는 상수 또는 변수입니다.Is a constant or variable that represents the exception. error_numberint이며 50,000 이상 2,147,483,647 이하여야 합니다.error_number is int and must be greater than or equal to 50000 and less than or equal to 2147483647.

messagemessage
예외를 설명하는 문자열 또는 변수입니다.Is an string or variable that describes the exception. messagenvarchar(2048) 입니다.message is nvarchar(2048).

statestate
메시지와 연결할 상태를 나타내는 0에서 255 사이의 상수 또는 변수입니다.Is a constant or variable between 0 and 255 that indicates the state to associate with the message. statetinyint입니다.state is tinyint.

RemarksRemarks

THROW 문 앞의 문 다음에는 세미콜론(;) 문 종결자를 붙여야 합니다.The statement before the THROW statement must be followed by the semicolon (;) statement terminator.

TRY...CATCH 구문을 사용할 수 없으면 명령문 일괄 처리가 종료됩니다.If a TRY...CATCH construct is not available, the statement batch is terminated. 예외가 발생한 줄 번호와 프로시저가 설정됩니다.The line number and procedure where the exception is raised are set. 심각도는 16으로 설정됩니다.The severity is set to 16.

매개 변수 없이 지정된 THROW 문은 CATCH 블록 안에 나타나야 합니다.If the THROW statement is specified without parameters, it must appear inside a CATCH block. 이렇게 하면 예외가 발생합니다.This causes the caught exception to be raised. THROW 문에 발생하는 오류로 인해 문 일괄 처리가 종료됩니다.Any error that occurs in a THROW statement causes the statement batch to be terminated.

%는 THROW 문의 메시지 텍스트에 예약된 문자이므로 이스케이프되어야 합니다.% is a reserved character in the message text of a THROW statement and must be escaped. %를 메시지 텍스트의 일부로 반환하려면 % 문자를 두 개 사용하세요(예: '증가가 원래 값의 15%%를 초과했습니다.').Double the % character to return % as part of the message text, for example 'The increase exceeded 15%% of the original value.'

RAISERROR와 THROW의 차이점Differences Between RAISERROR and THROW

다음 표에서는 RAISERROR 문과 THROW 문의 차이점을 보여 줍니다.The following table lists differences between the RAISERROR and THROW statements.

RAISERROR 문RAISERROR statement THROW 문THROW statement
msg_id가 RAISERROR에 전달되는 경우 ID가 sys.messages에 정의되어야 합니다.If a msg_id is passed to RAISERROR, the ID must be defined in sys.messages. error_number 매개 변수가 sys.messages에 정의되지 않아도 됩니다.The error_number parameter does not have to be defined in sys.messages.
msg_str 매개 변수는 printf 서식 지정 스타일을 포함할 수 있습니다.The msg_str parameter can contain printf formatting styles. message 매개 변수에는 printf 스타일 서식 지정을 사용할 수 없습니다.The message parameter does not accept printf style formatting.
severity 매개 변수는 예외의 심각도를 지정합니다.The severity parameter specifies the severity of the exception. severity 매개 변수가 없습니다.There is no severity parameter. 예외 심각도는 항상 16으로 설정됩니다.The exception severity is always set to 16.

Examples

1.A. THROW를 사용하여 예외 발생Using THROW to raise an exception

다음 예에서는 THROW 문을 사용하여 예외를 발생시키는 방법을 보여 줍니다.The following example shows how to use the THROW statement to raise an exception.

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

결과 집합은 다음과 같습니다.Here is the result set.

Msg 51000, Level 16, State 1, Line 1  
 
The record does not exist.

2.B. THROW를 사용하여 다시 예외 발생Using THROW to raise an exception again

다음 예에서는 THROW 문을 사용하여 발생한 예외를 다시 발생시키는 방법을 보여 줍니다.The following example shows how use the THROW statement to raise the last thrown exception again.

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;  
  

결과 집합은 다음과 같습니다.Here is the result set.

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.

C.C. THROW에 FORMATMESSAGE 사용Using FORMATMESSAGE with THROW

다음 예에서는 FORMATMESSAGE 함수를 THROW와 함께 사용하여 사용자 지정된 오류 메시지를 발생시키는 방법을 보여 줍니다.The following example shows how to use the FORMATMESSAGE function with THROW to throw a customized error message. 이 예제에서는 먼저 sp_addmessage를 사용하여 사용자 정의 오류 메시지를 만듭니다.The example first creates a user-defined error message by using sp_addmessage. THROW 문은 RAISERROR와 같은 방식으로 message 매개 변수에서 대체 매개 변수를 허용하지 않기 때문에 FORMATMESSAGE 함수를 사용하여 오류 메시지 60000에 필요한 3개의 매개 변수 값을 전달합니다.Because the THROW statement does not allow for substitution parameters in the message parameter in the way that RAISERROR does, the FORMATMESSAGE function is used to pass the three parameter values expected by error message 60000.

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;  
  

결과 집합은 다음과 같습니다.Here is the result set.

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).

참고 항목See Also

FORMATMESSAGE (Transact-SQL) FORMATMESSAGE (Transact-SQL)
데이터베이스 엔진 오류 심각도 Database Engine Error Severities
ERROR_LINE(Transact-SQL) ERROR_LINE (Transact-SQL)
ERROR_MESSAGE(Transact-SQL) ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER(Transact-SQL) ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE(Transact-SQL) ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY(Transact-SQL) ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL) ERROR_STATE (Transact-SQL)
RAISERROR(Transact-SQL) RAISERROR (Transact-SQL)
@@ERROR(Transact-SQL) @@ERROR (Transact-SQL)
GOTO (Transact-SQL) GOTO (Transact-SQL)
BEGIN...END (Transact-SQL) BEGIN...END (Transact-SQL)
XACT_STATE (Transact-SQL) XACT_STATE (Transact-SQL)
SET XACT_ABORT (Transact-SQL)SET XACT_ABORT (Transact-SQL)