다음을 통해 공유


THROW(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

예외를 발생시키고 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

예외를 설명하는 문자열 또는 변수입니다. 메시지 인수는 nvarchar(2048)입니다.

state

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

설명

상태를 사용하여 저장 프로시저, 트리거 또는 문 일괄 처리에서 오류의 원인을 식별할 수 있습니다. 예를 들어 여러 위치에서 동일한 메시지를 사용하는 경우 고유한 상태 값을 사용하면 오류가 발생한 위치를 찾는 데 도움이 될 수 있습니다.

문 앞의 THROW 문 뒤에 세미콜론(;) 문 종결자가 와야 합니다.

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

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

% 는 문의 메시지 텍스트에 예약된 문자이며 THROW 이스케이프해야 합니다. % 예를 들어 'The increase exceeded 15%% of the original value'메시지 텍스트의 일부로 반환 % 할 문자를 두 배로 지정합니다.

RAISERROR와 THROW의 차이점

다음 표에서는 RAISERRORTHROW 문의 차이점을 나열합니다.

RAISERROR 문 THROW 문
msg_id 전달RAISERROR되는 경우 ID를 에 정의sys.messages해야 합니다. error_number 매개 변수는 에 정의sys.messages할 필요가 없습니다.
msg_str 매개 변수는 서식 스타일을 포함 printf 할 수 있습니다. 메시지 매개 변수는 스타일 서식을 허용하지 printf 않습니다.
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사용하여 사용자 지정된 오류 메시지를 throw하는 방법을 보여 줍니다. 이 예제에서는 먼저 sp_addmessage를 사용하여 사용자 정의 오류 메시지를 만듭니다. 문은 THROW 메시지 매개 변수의 대체 매개 변수 RAISERROR 를 허용하지 않으므로 FORMATMESSAGE 이 함수는 오류 메시지에 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;

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

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