출처 : http://blog.naver.com/cana01/130170171710
[출처] [MSSQL] 0으로 나누기 오류 발생|작성자 잉그밧드
오랜만에 통계성 쿼리를 짜다 발생한 0 나누기 오류.
순간 당황한 것이 0으로 나눗셈은 오라클에서는 NVL로 처리를 했었던가?
그 기억조차 가물가물하다는 점이다.
결과론적으로는 MSSQL 에선 set 선언을 해주어야 한다.
SET ANSI_WARNINGS OFF
SET ARITHIGNORE ON
SET ARITHABORT OFF
SELECT 나눗셈~ FROM
먼저
SET ANSI_WARNINGS OFF
- 집계오류가 발생해서 메세지가 발생할 경우 그 것을 레코드로 인식해서 에러가 뜨므로 메세지 경고를 off시킨다
그 다음에
SET ARITHIGNORE ON
- 쿼리 실행 중 오버플로 또는 0으로 나누기 오류에서 오류 메시지를 반환할지 여부를 제어
오류 메시지가 반환될지 여부만 제어하며 이 설정에 상관 없이 오버플로 또는 0으로 나누기 오류를
발생시킨 계산에 NULL을 반환한다. 없는 값 처리를 해야하므고 오류를 발생시킨 것에서 null 반환을 받아야 한다!
SET ARITHABORT ON이면 오버플로 또는 0으로 나누기 오류 발생 시 쿼리나 일괄 처리가 종료
트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백시킨다. 그러나 이 설정이 INSERT, UPDATE, DELETE 문 실행 중에
발생한 오류에는 영향을 주지 않는다.
오류가 난 것은 위에서 NULL로 반환시켜주었고, 하위 쿼리들을 계속 해주어야 하므로
SET ARITHABORT OFF 선언!
MSSQL SET 명령어가 제법 많다는 사실에 충격!
그리고 지금까지 그것을 제대로 쓰지않고 작업했다는 사실에 더 충격!
또한 이 쿼리가 호환성 어디부터 지원해주는지는 모르긋다에 더더더 충격!
[출처] [MSSQL] 0으로 나누기 오류 발생|작성자 잉그밧드
'SQL' 카테고리의 다른 글
[MSSQL] getdate()를 이용한 데이터 조회 date (0) | 2013.12.10 |
---|---|
[MSSQL] round, ceiling 차이점 (0) | 2013.11.18 |
[MSSQL] MS SQL에서 다른 서버에 select를 실행하려면? (0) | 2013.08.21 |
[MSSQL] SQL Server Management Studio 단축키 (0) | 2013.08.09 |
[MSSQL]tempDB경로변경 (0) | 2013.07.18 |