다음 sp 를 봅시다.

create proc dbo.up_test
as

set nocount on
set transaction isolation level read uncommitted

declare @v int

select @v = isnull(col1,0) from test where col2 = '1'

select @v


test 테이블의 데이터는 이렇게 되어 있습니다.

[test]
col1    col2
2       '2'

데이터가 이렇게 되어 있으니까 select문은 아무것도 리턴하지 않겠지요. 아마도 이런 상황을 대비해서 isnull() 을 썼을 겁니다. 그러면 과연 예상대로 0 이 나올까요??

...

돌려보시면 안그렇습니다. isnull() 에도 불구하고 NULL 이 리턴됩니다. isnull 이 동작하려면 실제로 NULL이라는 값이 테이블에 존재하고, 그것을 읽어와야지 됩니다. 그런데 이 경우, 아예 읽어온 것이 아무것도 없죠. 따라서 declare 다음에 set @v = 0 을 해줘야 합니다. 초기화를 한 후에 sp 를 돌려봅시다.

어떻습니까? 0 이 나오지요??

사실 어떤 언어로 개발을 하던 변수 초기화는 매우 중요한 문제입니다. T-SQL이라고 예외는 아니지요. sp가 알 수 없는 데이터를 리턴한다던가, 예상치 않은 방식으로 동작한다면 저런 경우가 없는지 한번쯤 의심해 볼 일입니다. ;-)


--------추가---------
위의 예문에서 초기화를 하지 않았을 경우 조회하는 결과값이 항상 하나만 리턴된다면

select @v = isnull(min(col1),0) from test where col2 = '1'

이렇게 해도 됩니다.

Posted by maceo

03 20, 2006 11:59 03 20, 2006 11:59
, , ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/39

Trackback URL : http://merritt.co.kr/tt/trackback/39

Leave a comment
[로그인][오픈아이디란?]
« Previous : 1 : ... 50 : 51 : 52 : 53 : 54 : 55 : 56 : 57 : 58 : ... 74 : Next »

블로그 이미지

가늘어도 긴놈이 장땡

- maceo

Archives

Authors

  1. maceo

Calendar

«   3 2010   »
  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      

Site Stats

Total hits:
170288
Today:
32
Yesterday:
47