블로그 이미지
정홍주
Azure에 대한 내용뿐만 아니라 새로운 트렌드로 빅데이터, BI, SharePoint, 앱 등의 내용을 다룹니다.

calendar

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Notice

2012.05.02 08:30 SQL

SQL Server 2012 T-SQL New Feature –THROW

 

이번 내용은 오류 처리에 대한 간단한 내용입니다. .NET 프로그래밍에서 에러 핸들링은 try catch 구문을 통해 작업을 하게 되며 class 등에서는 catch 문장에서 오류를 UI 단으로 아래와 같이 throw 시켜주게 됩니다.

try

            {

 

            }

            catch (System.DivideByZeroException ex)

            {

                throw new System.Exception(ex.Message);

            }

        }

 

SQL Server 2005 버전부터 TRY, CATCH 문장을 지원해주고 있었는데 에러를 발생시키는 내용은 오류 메시지를 사전에 등록해두거나 아니면 사용자 지정 메시지를 RAISERROR 구문을 사용했었습니다.

SQL Server 2012 버전부터는 THROW 구문을 사용해야 하며 앞에서 살펴본 몇몇 기능들과 마찬가지로  .NET 프로그래밍과 거의 유사합니다.

THROW [ { error_number | @local_variable },

        { message | @local_variable },

    { state | @local_variable }

] [ ; ]

 

 

간단한 예제를 한번 살펴보도록 하겠습니다.

Deparment 테이블의 경우 Name에 고유인덱스가 걸려있어 아래와 같이 기존 부서 이름을 입력시는 오류가 발생하게 됩니다. CATCH 문장에서 THROW를 통해 응용 프로그램이나 호출하는 프로시저로 오류를 전달할 수 있습니다.

BEGIN TRY

             INSERT [HumanResources].[Department] (Name, GroupName)

             VALUES ('Engineering','Manufacturing')

END TRY

BEGIN CATCH

              THROW;

 

END CATCH

 

--(0 행이 영향을 받음)

--메시지 2601, 수준 14, 상태 1, 3

--고유 인덱스 'AK_Department_Name'() 포함하는 개체 'HumanResources.Department' 중복 행을 삽입할 없습니다. 중복 값은 (Engineering)입니다.

 

 

물론 .NET 프로그래밍처럼 사용자 지정 오류메시지를 아래와 같이 THROW 시킬 수 있습니다.

BEGIN TRY

             INSERT [HumanResources].[Department] (Name, GroupName)

             VALUES ('Engineering','Manufacturing')

END TRY

BEGIN CATCH

              THROW 50001,'부서 이름 중복',1;

 

END CATCH

 

--(0 행이 영향을 받음)

--메시지 50001, 수준 16, 상태 1, 7

--부서 이름 중복

 

THROW 구문 전에 오류로그 저장등을 위해 ERROR_NUMBER() 등을 사용할 수 있습니다.

 

BEGIN TRY

             INSERT [HumanResources].[Department] (Name, GroupName)

             VALUES ('Engineering','Manufacturing')

END TRY

BEGIN CATCH

              SELECT  ERROR_NUMBER(),  ERROR_PROCEDURE(), ERROR_MESSAGE();

              THROW 50001,'부서 이름 중복',1;

              

END CATCH

 

THROW에 대한 자세한 내용은 아래 링크를 참조할 수 있습니다.

http://msdn.microsoft.com/ko-kr/library/ee677615.aspx

 

신고
posted by 정홍주