데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.

2011. 10. 28. 13:45


분명 int형이 아닌 varchar형으로 값을 받아왔는데도 불구하고,
프로시저를 실행시켰을 때,
데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.
라는 오류가 발생하여 며칠을 고생했다..

간단하게 표현하면 다음과 같은 로직..

Create   PROCEDURE [dbo].[프로시저 명]          
  @start VARCHAR(255),
  @end VARCHAR(255)               -- 시작 값과 끝 값을 varchar로 받는다..

while (@start <= @end)             --시작 값이 마지막 값과 같아질 때까지 돌자.
     Insert into 테이블명 (시작값 )
               values   (@start )      --지정한 테이블에 시작 값 입력..
    Set @start = @start + 1        --시작 값에 +1 추가


이런식으로 아무 문제없이 작동하던 프로시저가 난관에 봉착..
받아와야 하는 시작 값이  24136965000, 마지막 값이 24136965010 이 되자,
데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.
라는 오류를 뱉어내는 것이다..

DB에서 실행하면 그나마 중지라도 시키지..
웹상에서 실행되면 무한으로 돌며 중지도 안되고,
결국, 실 DB서버 CPU를 100%를 만들어버리는 어처구니 없는 일이 발생..

뭐지? 뭐지? 난 int형을 받지 않았는데??

그래서 먼저 int형에 대해 확인 했다..
- 2147483648 ~ 2147483647 (int형의 범위)

내가 등록하려는 값이 int형 범위를 벗어나긴 했다..
그래? 그럼 Bigint 형 쓰면 깔끔하게 해결되네..?
맞다.. 헌데, 받아오는 값이 '0'으로 시작할 때가 있어서 이것도 답이 되진 못했고..

암튼, 이런저런 삽질을 하다가
Set @start = @start + 1 -> 이 구문을 다음과 같이 변경..
Set @start = convert(bigint, @start) + 1

미션 해결..

아직도 varchar로 받은 값이 while 문을 돌며 int형으로 잡히는지 모르겠지만,
이런식의 해결도 있으니 참고하면 좋을 듯..

텍사스양 일상에서