MS SQL 2005 로 업 되면서 갠찬은 기능들이 추가되었다... 그 동안 좀 아쉬웠던 기능들...
그 기능들을 정리하고자 한다...

추가된 기능들 중...
가장 좋은 것이라 생각되는...(어디까지나 내 기준.....) 것부터 정리 하고자 한다..
오늘은 첫번째로...(그렇다고 내일 두번째가 올라 오는 것은 아니다....)

Try... Catch... 문....

2005 첫 발표 세미나에 참석해서....
이 놈을 딱 보는 순간... 다른 기능은 눈에 안들어 올 만큼....
나에게는 아주 확실하게 다가온 기능....

MS SQL 2000 까지는 에러 체크가 쿼리문보다 더 짜증났다...
이 부분은..대체로 SP 를 많이 작성하시는 분은... 공감하시겠지만...

begin tran

insert into aaa
values ()

insert into bbb
values ()

commit tran
위와 같은 예제에서... 에러를 검출하려면....

일단 쉽게하면...

begin tran

insert into aaa
values ()

insert into bbb
values ()

if @@error = 0
commit tran
else
rollback tran

의외로 이렇게 에러를 체크하는 개발자들이 많았다....
아마도... 별 문제 없이 실행은 되었을 것이다...... 아마도....

위 소스의 문제점이 무었이겠는가....
@@error 는 전역 변수이다.... 변수 라는 것은 단일 버퍼를 가지고 있는 것.. 즉, 값은 항상 마지막 값만 가지고 있다... @@error 에 들어 가는 값은 마지막으로 실행된 쿼리(?)의 결과값을 가지고 있다...
위의 소스에서....
if @@error 이전에 몇번의 쿼리가 실행되었는지 아는 사람.......
아마도... 3번 이라고 말하는 사람보다.... 2번 이라고 외치는 사람이 더 많을 것이다...
왜?
begin tran 을 무시하지 말자.... insert.. delete 로 시작하는 것만 쿼리는 아니다...
3번을 실행했는데... @@error은 마지막에 한번만 체크한다.....
그럼 결과는?
마지막 insert 문의 결과에 따라 결정나게 된다... 마지막 insert 문이 성공하면...commit이고 실패하면 rollback 이 된다.... rollback은 문제가 안된다... 최악의 경우 첫번째 insert 문은 실패를 했는데 두번째 insert 문이 성공하면? 그럼 바로 commit 이다... 오호라....

begin tran

insert into aaa
values ()
if @@error = 0
insert into bbb
values ()
if @@error = 0
commit tran
else
rollback tran
else
rollback tran

좀 짜증나는 코딩이기는 하지만.... 확실하게 챙기고 가고 있다....
begin tran 다음에 왜 에러체크 안하냐고 말씀하시지 마시고 직접 해 보셔도 무방하다...

2000까지는 저랬다....
그렇다고 저 놈이 에러를 100% 잡느냐? 덴장... 잡기나 하면......

@@error는 실행되고 난 후 결과를 저장한다...
즉, 실행 중 에러나면....???
예를 들어... 저장했는데... PK가 중복된다면...???

2005에서는 이런 문제를 한방에 해결하는 방법이 추가됬으니...
Try..Catch 문이다..
Java 나 c++, c# 등을 사용해 보신 분은 아시겠지만.....에러 체크는 정말 확실하다...
현재까지 해 본 바로는 100% 에러 체크가 된다.....

begin try
....
end try
begin catch
....
end catch

일단 기본 구조는 위와 같다....
즉... 실행 구문을 begin try.. end try로 감싸고.....
그 안에서 에러 날 경우 begin catch 문으로 튄다.....

begin try
begin tran

insert into aaa
values ()

insert into bbb
values ()

commit tran
end try
begin catch
print error_message()
rollback tran
end catch

확실히 간결하지 않은가...
error_message()는 에러내용을 알려 준다.. 2005에서 추가된 함수이다.. 2000 이하에서는 sp 에서 그 내용을 리턴하려면... msater db랑 조인을 걸고... 했다...error_message() 뿐 아니라.. error_number(), error_line(), error_procedure(),... 등등이 있다...
궁금하신 분들은 MS SQL 2005 도움말에서 error로 검색하면 좌르르 나온다...

begin ..try.. 문은 sp 내에서 한번만 사용해야 하는 것은 아니다... 위치도 꼭 처음에 선언해야 하는 것은 아니다... 원하는 위치에서 원하는 만큼 선언해서 사용하면 된다...

begin try
...
end try
begin catch
...
end catch
set @aaa = 'aa'
begin try
...
end try
begin catch
....
end catch

이것두 좋구...
begin try
...
begin try
...
end try
begin catch
...
end catch
end try
begin catch
...
end catch
이것두 좋구.....
아~~~ 좋 다좋 다좋 다좋 아~~~

오늘은 여기 까지...
정리하면....
MS SQL 2005에서 에러 검증은 정말 간단하면서 편하게 할 수 있게 되었다...
많이 애용(?) 하자.....

다음에는...
원래 생각은 계층형 구조의 자료를 가져와 트리 구조를 만들어 주는 기능을 할까 했는데...
그것 보다는 Row_number() 가 좀 더 현실적일 것 같아서...
그 놈을 정리해야 것다....
Posted by 퓨전마법사
,