2016-07-05 7 views
0

정수 곱셈의 SELECT이 실패하는 이유를 설명 할 수 있습니까? 선택 1024 * 1024 * 1024 * 1024가 실패합니다.

SELECT 1024*1024*1024*1024 -- ERROR 

인해 INT 데이터 형 임계 값보다 더 큰되고 곱셈 결과에인가? 식을 int 데이터 형식 변환

DECLARE @VAL AS BIGINT 
SET @VAL = 1024 -- OK 
SET @VAL = 1024*1024 -- OK 
SET @VAL = 1024*1024*1024 -- OK 
SET @VAL = 1024*1024*1024*1024 -- ERROR 
SET @VAL = 1099511627776 -- OK - 1024*1024*1024*1024=1099511627776 
SET @VAL = CAST((1024*1024*1024*1024) AS BIGINT) -- ERROR 

오류 메시지

산술 오버플로 오류.

int, bigint, smallint, and tinyint (Transact-SQL)

주의

사용하는 경우 +, -, *,/또는 % 산술 연산자의 암시 적 또는 명시 적 변환을 수행하기 위해 INT, SMALLINT, TINYINT, 또는 float, real, decimal 또는 numeric 데이터 형식에 bigint 상수 값을 사용하면 쿼리가 자동 매개 변수화되었는지 여부에 따라 SQL Server에서 데이터 형식과 식 결과의 정밀도를 계산할 때 적용되는 규칙이 달라집니다.

따라서 쿼리의 비슷한 표현식은 때로는 다른 결과를 생성 할 수 있습니다. 쿼리가 자동 매개 변수화되지 않은 경우 상수 값은 먼저 숫자로 변환됩니다.이 정밀도는 지정된 데이터 형식으로 변환하기 전에 상수 값을 보유 할만큼 충분히 큽니다. 예를 들어 상수 값 1은 숫자 (1, 0)로 변환되고 상수 값 250은 숫자 (3, 0)로 변환됩니다.

쿼리가 자동 매개 변수화 될 때 상수 값은 최종 데이터 형식으로 변환하기 전에 항상 숫자 (10, 0)로 변환됩니다./연산자가 관련 될 때 결과 유형의 정밀도가 유사한 쿼리간에 다를 수있을뿐만 아니라 결과 값도 다를 수 있습니다. 예를 들어 SELECT CAST (1.0/7 AS float)식이 포함 된 자동 매개 변수가 지정된 쿼리의 결과 값은 자동 매개 변수가 지정되지 않은 동일한 쿼리의 결과 값과 다를 수 있습니다. 자동 매개 변수가있는 쿼리의 결과가 적합하도록 잘립니다 숫자 (10, 0) 데이터 유형으로 변환하십시오.

+0

이 그래, 즉 :

해결 방법은 같은 BIGINT의 varialbe에서 작업에 사용하는 번호를 저장 할 수 있습니다. –

+2

오류 메시지가 매우 분명해 보입니다. - 표현식을 데이터 유형 int로 변환하는 산술 오버플로 오류. " 아마도 int는 32 비트이고 1024^4 == (2^10)^4 == 2^40은 32 비트 정수 (2^32) –

+0

의 범위를 초과합니다. SELECT CAST (1024 AS BIGINT) * 1024 * 1024 * 1024' <- SQL Server는 10 진수 값 (1024)이없는 상수를 정수로 변환합니다. SQL Server에서 BIGINT를 사용하도록 명시 적으로 값 중 하나를 전송하십시오. – Pred

답변

-1

더 많은 인터넷 검색 결과를 반환하지 않는 쿼리가 발견되었습니다. 이 I/진수 값 중 하나를 변환하는 경우, 즉 숫자 1024.0

1024는 INT이다 TSQL Arithmetic overflow using BIGINT

SELECT 1024*1024*1024*1024.0 -- OK 
DECLARE @VAL AS BIGINT 
SET @VAL = 1024 -- OK 
SET @VAL = 1024*1024 -- OK 
SET @VAL = 1024*1024*1024 -- OK 
SET @VAL = 1024*1024*1024*1024.0 -- OK 
SET @VAL = 1099511627776 -- OK 

select SQL_VARIANT_PROPERTY(CONVERT(sql_variant,1024.0),'BaseType') -- numeric 
select SQL_VARIANT_PROPERTY(CONVERT(sql_variant,1024*1024*1024*1024.0),'BaseType') -- numeric 
+0

FLOAT는 정확한 데이터 유형이 아니므로 조심하십시오! – Pred

+0

이것은 정밀 오차를 발생시키는 것을 의미합니까? 이것에 대해 더 자세히 알 수있는 방법은 무엇입니까? – SimplyInk

+0

예, 정밀도 오류가 발생할 수 있습니다. doc에서 float 및 실제 데이터 유형에 대한 기사를 읽으십시오. SO에서 SQL Server 정밀도 오류를 검색하거나 즐겨 사용하는 검색 엔진을 사용하여 몇 가지 예를 찾으십시오. 다음은 SO의 질문 중 하나입니다. http://stackoverflow.com/questions/4199371/sql-server-precision-crazyness – Pred

4

때문에 참조. SQL-Server는 산술 기능을 만들기 위해 첫 번째 데이터 형식을 사용합니다.

용어는 왼쪽에서 오른쪽으로 계산됩니다.

1099511627776이라고 쓰면 숫자 값입니다.

캐스트 BIGINT (또는 숫자)에 첫 번째 값이 다음 작동 :

select cast(1 as bigint)*1024*1024*1024*1024 
+0

"bigint입니다."- 그렇지 않습니다. 그것은 '숫자'입니다. 질문에 대한 코멘트에 게시 된 샘플을보십시오. –

+0

네, 맞습니다 - 숫자 (13,0) - 내 대답이 맞습니다. –

1

를이 경우, SQL은 작업을 완료하기 위해 기본적으로 유형 INT를 사용합니다. 이것은 결과 값이 INT의 최대 용량 (2,147,483,647)을 오버플로하는 경우 왜 오류가 발생하는지 설명합니다.산술 오버플로가 무엇인지, 메모리가 부족하면 결과를 저장하는

DECLARE @NUMBER AS BIGINT = 1024 
DECLARE @VAL AS BIGINT 
SET @VAL = @NUMBER 
SET @VAL = @NUMBER*@NUMBER 
SET @VAL = @NUMBER*@NUMBER*@NUMBER 
SET @VAL = @NUMBER*@NUMBER*@NUMBER*@NUMBER 
SET @VAL = 1099511627776 
SET @VAL = CAST((@NUMBER*@NUMBER*@NUMBER*@NUMBER) AS BIGINT) 
관련 문제