Programming/Microsoft SQL Server
1. sp_addmessage

sp_addmessage는 기본적인 Error Message대신 개발자가 직접 Error Message를 작성할 수 있도록 해줍니다.

sp_addmessage 오류번호, 심각도, message내용, 사용언어, 로그여부, 재작성여부
▶<1-1>

<1-1>은 sp_addmessage의 형식을 나타내고 있으며 각 형식에 맞게 들어갈 인수는 다음과 같습니다.

(1) 오류번호
개발자가 직접 Message를 작성하는 경우 오류번호는 50001부터 시작합니다.(50000까지는 기존 Message를 위해 이미 확보된 영역입니다.)

(2) 심각도
1 ~ 25까지 설정합니다.(단, 19 ~ 25까지는 관리자권한의 계정만 설정이 가능합니다.)

(3) Message내용
실제 보여줄 Message를 작성합니다.(Message의 최대크기는 nVarchar(255)까지 입니다.)

(4) 사용언어
Message를 보여줄 언어의 설정부분입니다. 설정이 영어이면 영어, 한국어이면 한국어로 Message를 보여주게 됩니다. 이때 설정된 언어에 따라 다른 언어의 Message를 보여 주어야 하는 경우 같은 오류번호에 여러 언어의 Message를 담을 수도 있습니다.

(5) 로그여부
Message를 출력할때 Windows Application Event Log에 이력을 남겨둘지 지정합니다. 이 인수가 True면 남기고 False이면 남기지 않습니다.

(6) 재작성여부
이미 같은 오류번호, 언어의 Message가 존재할 경우 덮어쓸지 지정하는 부분으로 이 인수를 'Replace'로 지정하는 경우 덮어 쓰게 됩니다.

아래 <1-2>는 sp_addmessage를 통해 Error Message를 추가하는 예제입니다.

Exec sp_addmessage 50001, 16, 'Error', Us_English;
Exec sp_addmessage 50001, 16, '에러', 한국어;
▶<1-2>

<1-2>에서 보여지고 있는 것처럼 sp_addmessage이용해 Message를 추가하는 경우 먼저 Us_English를 통해 영어부터 추가하고 이 후 원하는 언어의 Message를 추가하도록 합니다. 왜냐하면 사용자가 추가한 Message를 보여줄때 현재 언어설정에 상관없이 영어 Message부터 찾고 다시 현재 언어설정에 따른 Message를 찾기 때문입니다.

이제 추가한 Message를 확인해 보도록 하겠습니다.

Select *
From sys.messages
Where message_id in (50001);
▶<1-3>

<1-3>에서 보이는 것처럼 Error Message는 sys.messages system Table에 저장됩니다.

만일 sp_addmessage를 통해 추가한 Message를 삭제하고자 하신다면 sp_dropmessage Procedure를 사용합니다.(되도록이면 sys.messages Table을 직접 조작하지 마십시오.!)

Exec sp_dropmessage 50001, 한국어;
Exec sp_dropmessage 50001, Us_English;

Message의 등록은 영어부터 했지만 삭제는 다른언어의 Message부터 먼저 삭제하고 그 다음 영어 Message를 삭제해야 합니다.

2. Formatmessage

Formatmessage는 기존의 Message를 재가공하여 다른형태(내용)의 Message를 출력할 수 있도록 합니다. 다만 Formatmessage는 sp_addmessage를 통해 추가된 Message만 동작이 가능합니다.

Formatmessage활용을 위해 sp_addmessage로 새로운 Message를 추가해 보도록 하겠습니다.

Exec sp_addmessage 50001, 16, '%s Error', Us_English;
Exec sp_addmessage 50001, 16, '%1! 에러', 한국어;
▶<1-4>

<1-4>에서 보시면 Message내용에 %s 를 붙여 매개변수를 받을 수 있도록 했습니다.(영어에서는 %s이며 한국어는 %1!를 사용합니다.)

이제 Formatmessage를 통해 위에서 추가한 Message를 가공해 보도록 하겠습니다.

Select Formatmessage(50001, 'message =>');
▶<1-5>

<1-5>에서는 Formatmessage를 통해 50001번의 오류번호에 해당하는 Message를 출력하도록 합니다. 단, 'message =>'라는 문자열을 통해 설정된 매개변수에 담아 출력하도록 합니다.(sp_addmessage와는 달리 Formatmessage는 함수이기 때문에 Exec를 붙이지 않습니다.)


만일 한글 Message가 보여지도록 할 경우 언어설정을 한국어로 바꾸도록 합니다.

Set language 한국어;
Select Formatmessage(50001, 'message =>');
▶현재 언어설정을 한국어로 바꾸어 줍니다.


만일 영문 SQL Server나 예제 Database인 AdventureWorks2008을 사용하는 경우 한글이 '??'등의 문자로 나타나는등 제대로 표시되지 않을 수가 있습니다. 이런경우 출력할 내용의 앞부분에 다음과 같이 'N'문자를 붙이면 정상적으로 한글이 표시될 것입니다.

Exec sp_addmessage 50001, 16, N'%1! 에러', 한국어;
Select N'한글입니다.';

주의:
Formatmessage는 매개변수지정 부분에서 다음과 같이 생략이 가능합니다.

Select Formatmessage(50001);

그러나 매개변수를 생략할때 호출되는 Message가 %를 사용해 매개변수를 받도록 설정되어 있다면 해당 부분은 null로 표시됩니다.


3. Raiserror

정해진 형태가 아닌 동적으로 Message를 처리하고자 할때는 Raiserror함수를 사용합니다.(물론 sp_addmessage를 통해 추가된 Message도 처리할 수 있습니다.)

Raiserror함수의 문법은 다음과 같습니다.

① Raiserror(message내용, 오류심각도, 상태, 매개변수);
② Raiserror(message번호, 오류심각도, 상태, 매개변수);

1번은 사용자가 임의로 Message를 출력하고자 할때이며 2번은 sp_addmessage를 통해 추가된 Message를 출력할때 입니다.

아래 예제는 Raiserror를 통해 Message를 반환하는 예제입니다.

Raiserror('Error Code', 16, 1);


Raiserror(50001, 16, 1, 'message =>');

sp_addmessage를 통해 추가된 50001번 Message를 이용하여 출력합니다.


Raiserror를 통해 Message를 직접 작성할 경우 별도의 매개변수를 추가하고자 한다면 다음과 같이 작성합니다.

Declare @Code Char(02);Set @Code = 'ER';Raiserror('Error Code -> %s', 16, 1, @Code);

변수를 사용해 Message를 출력합니다.


만일 Raiserror로 Message출력시 오류심각도를 19이상으로 한다면 Log를 기록하는 With Log가 다음과 같이 추가되어야 합니다.

Raiserror('Database 오류 발생', 19, 1) With Log;

With Log Option이 사용되면 Windows운영체제의 Event Log에 아래 그림처럼 이력이 남게 됩니다.


주의:
Raiserror를 Try Catch문안에서 활용하시고자 한다면 오류심각도 설정에 신중을 기해야 합니다. 오류 심각도는 11~19사이에 지정할 수 있는데 만일 이 범위를 벗어나면 Try Catch문에서 오류를 Catch할 수 없어 Message가 출력되지 않을 수 있습니다.
0 0