2016-12-02 3 views
0

case 문이있는 SQL 쿼리가 있습니다. case 문은 두 개의 정수 값을 더하고 그 합이 다른 int 유형 변수에 다시 할당하기 위해 sql에서 허용하는 최대 정수 값보다 작은 지 확인합니다 (단순화를 위해 예제에서 반올림 됨). 두 값이 추가되는 WHEN 문에서 sum 값이 sql max allowed integer보다 크기 때문에 전체 문에서 SQL 산술 예외가 발생합니다. I는 두 정수 값을 추가 할 때 내부에서 합계 값을 임시 정수 변수에 배치 같은데 .. 예두 개의 큰 int 값을 추가하는 조건이있는 SQL case 문

Declare @int1 as Int =2147483598 
Declare @int2 as Int =2147483598 
Declare @int3 as Int =0 
DECLARE @MaxIntValue INT = 2147483600 

set @int3 = (CASE WHEN (@int1 < 2) 
        THEN @int1 
        WHEN ((@int1 + @int2) < @MaxIntValue) 
        THEN @int1 + @int2 
        ELSE @int1 
      END) 
select @int3 

가 나는 변수 중 하나의 유형을 변경하면 곳 주변 작업을 발견 BIGINT 대신 은 (즉,

Declare @int1 as bigint =2147483598 

) 내가 다시 지금 내부적으로 합계 값을 보유하는 데 사용되는 변수의 데이터 유형을 가정하고 있기 때문에 문제가 해결 뿐만 아니라 A 형 BIGINT로 변경됩니다. 현실적으로이 쿼리는이 값들이 조달되는 곳의 여러 테이블을 포함하는 훨씬 더 크고 복잡한 저장 프로 시저의 일부이기 때문에이 솔루션을 피하고 싶습니다. 감사합니다.

+0

을 BIGINT 캐스팅하려고? 해결 방법이 있어요 .. 뭐가 잘못 됐어요, 정확히 요? – Blorgbeard

+0

이 case 문은 실제로 큰 저장된 proc의 일부이며 두 테이블의 필드가 병합되고이 CASE 문을 기반으로 필드 중 하나가 업데이트되는 MERGE 문 안에 캡슐화됩니다. 이 예제에서 사용한 정수 값은 테이블에서 직접 가져온 것이므로 가장 간단한 솔루션이라고 생각하지 않는 테이블의 데이터 유형을 변경해야합니다. – Shegute

+0

왜 변수를 bigint로 캐스트하지 않습니까? –

답변

1

는 대답은 어떤 종류의 당신이 찾고있는, 그래서

Declare @int1 as Int =2147483598 
Declare @int2 as Int =2147483598 
DECLARE @MaxIntValue BIGINT = 2147483600 
        ^^^^^^ 
set @int3 = (CASE WHEN (@int1 < 2) 
        THEN @int1 
        WHEN ((CAST(@int1 AS bigint) + 
         CAST(@int2 AS bigint)) < @MaxIntValue) 
        THEN @int1 + @int2 
        ELSE @int1 
      END); 
select @int3 
+0

후안 감사합니다. 변수를 형변환하여 문제가 해결되었습니다. 단지 FYI, @MAXIntValue 변수 유형을 변경할 필요가 없었습니다. 즉, 아무런 효과가없는 것처럼 보였습니다. 전체 예제도 가져 주셔서 감사합니다. – Shegute

+0

당신이 일한다고해도, 나는 미안보다 오히려 안전합니다. 어쩌면 엔진이 문 뒤에있는 캐스팅을하고있을 수도 있습니다. –