문제

나는 이것이 간단한 예의 형태로 가장 잘 요구된다고 생각합니다. 다음과 같은 SQL 덩어리는 a "DB-library 오류 : 20049 심각도 : 4 메시지 : 데이터 수정이 오버플로를 초래했습니다." 메시지이지만 어떻게 되나요?

declare @a numeric(18,6), @b numeric(18,6), @c numeric(18,6)
select @a = 1.000000, @b = 1.000000, @c = 1.000000
select @a/(@b/@c)
go 

이것은 어떻게 다른가 :

select 1.000000/(1.000000/1.000000)
go

어느 것이 잘 작동합니까?

도움이 되었습니까?

해결책

나는 마지막으로 Sybase를 사용하려고 시도했을 때 (수년 전에) 같은 문제에 부딪쳤다. SQL Server 사고 방식에서 나오면 Sybase가 수학적으로 Decimals를 강요하려고 시도한다는 것을 몰랐습니다. ~해야 한다 하다. :)

로부터 Sybase 매뉴얼:

산술 오버 플로우 오류는 새로운 유형에 결과를 수용하기에는 소수점 이하 자리가 너무 적을 때 발생합니다.

그리고 더 아래로 :

숫자 또는 소수점 유형으로의 암시 적 변환 중에 스케일 손실은 스케일 오류를 생성합니다. Arithabort Numeric_truncation 옵션을 사용하여 이러한 오류가 얼마나 심각한지를 결정하십시오. 기본 설정 인 Arithabort Numeric_truncation on은 오류를 일으키지 만 트랜잭션 또는 배치에서 다른 명령문을 계속 처리합니다. Arithabort Numeric_truncation을 설정하면 Adaptive Server가 쿼리 결과를 자르고 계속 처리합니다.

그래서 시나리오에서 정밀도 손실이 허용 될 수 있다고 가정합니다., 당신은 아마도 거래 초기에 다음을 원할 것입니다.

SET ARITHABORT NUMERIC_TRUNCATION OFF

그리고 거래가 끝날 때 :

SET ARITHABORT NUMERIC_TRUNCATION ON

이것이 몇 년 전 저를 위해 그것을 해결 한 것입니다 ...

다른 팁

이것은 단지 추측이지만 DBMS가 변수의 동적 값을 보지 않고 잠재적 값 만 보지 않을 수 있습니까? 따라서, 6-1에 숫자는 6-1cimal 숫자로 나뉘어 진 6 숫자가 12-10decimal 숫자를 초래할 수있다; 리터럴 부문에서 DBMS는 오버플로가 없다는 것을 알고 있습니다. 그래도 DBM이 왜 신경 쓰는지 확실하지 않습니다.

첫 번째 예제에서 변수를 선언했기 때문에 결과는 동일한 선언 (예 : 숫자 (18,6)) 일 것으로 예상되지만 그렇지 않습니다.

첫 번째는 SQL2005에서 작동했지만 (1.000000 [동일한 선언 된 유형])에서 두 번째는 반환했지만 (1.0000000000000000000000000 [총 다른 선언]).

직접 관련이 없지만 Sybase ASE (12.5.0.3)를 사용하여 산술 오버플로 오류로 누군가를 누군가를 절약 할 수 있습니다.

나는 나중에 업데이트하려는 임시 테이블에서 몇 가지 기본값을 설정하고 산술 오버플로 오류를 발견했습니다.

declare @a numeric(6,3)

select 0.000 as thenumber into #test --indirect declare

select @a = ( select thenumber + 100 from #test )

update #test set thenumber = @a

select * from #test

오류 표시 :

Arithmetic overflow during implicit conversion of NUMERIC value '100.000' to a NUMERIC field .

내 머릿속에서 작동해야하지만 'wherumber'열이 선언되지 않았다 (또는 소수점 (4,3)으로 간접적으로 선언). 따라서 내 경우에는 000.000과 마찬가지로 임시 테이블 열을 스케일과 정밀도로 간접적으로 선언해야합니다.

select 000.000 as thenumber into #test --this solved it

바라건대 그것은 누군가를 어느 정도 절약 할 수 있기를 바랍니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top