출처 : http://blog.naver.com/cana01/130170171710




오랜만에 통계성 쿼리를 짜다 발생한 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 명령어가 제법 많다는 사실에 충격!

그리고 지금까지 그것을 제대로 쓰지않고 작업했다는 사실에 더 충격!

또한 이 쿼리가 호환성 어디부터 지원해주는지는 모르긋다에 더더더 충격!

 


Posted by 요지
,