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
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'
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

