THROW(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft FabricWarehouse에 있는 SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform System(PDW) SQL 분석 엔드포인트

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

Transact-SQL 구문 규칙

Syntax

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

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

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

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

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

설명

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

TRY...CATCH 구문을 사용할 수 없으면 명령문 일괄 처리가 종료됩니다. 예외가 발생한 줄 번호와 프로시저가 설정됩니다. 심각도는 16으로 설정됩니다.

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

%는 THROW 문의 메시지 텍스트에 예약된 문자이므로 이스케이프되어야 합니다. %를 메시지 텍스트의 일부로 반환하려면 % 문자를 두 개 사용하세요(예: '증가가 원래 값의 15%%를 초과했습니다.').

RAISERROR와 THROW의 차이점

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

RAISERROR 문 THROW 문
msg_id가 RAISERROR에 전달되는 경우 ID가 sys.messages에 정의되어야 합니다. error_number 매개 변수가 sys.messages에 정의되지 않아도 됩니다.
msg_str 매개 변수는 printf 서식 지정 스타일을 포함할 수 있습니다. message 매개 변수에는 printf 스타일 서식 지정을 사용할 수 없습니다.
severity 매개 변수는 예외의 심각도를 지정합니다. severity 매개 변수가 없습니다. THROW를 사용하여 예외를 시작하면 심각도는 항상 16으로 설정됩니다. 그러나 THROW를 사용하여 기존 예외를 다시 throw하면 심각도가 해당 예외의 심각도 수준으로 설정됩니다.
SET XACT_ABORT를 적용하지 않습니다. SET XACT_ABORT가 ON이면 트랜잭션이 롤백됩니다.

예제

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

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

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

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

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

B. 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;  
  

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

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

다음 단계

다음 문서에서 관련 개념에 대해 자세히 알아보세요.