2016-07-05 5 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)に変換されます。クエリがautoparameterizedれると

、一定の値は、常に最終的なデータ型に変換する前に(10、0)の数値に変換されます。 /演算子が含まれている場合、結果の型の精度は類似した問合せで異なるだけでなく、結果の値も異なる場合があります。たとえば、SELECT CAST(1.0/7 AS float)という式を含む自動パラメータ化クエリの結果値は、自動パラメータ化されていないクエリの結果値とは異なります。これは、自動パラメータ化クエリの結果が、数値(10、0)データ型に変換します。

+0

をうん、まあそれは、算術オーバーフローが結果を格納するためのメモリが不足しているものです。 –

+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は、小数点以下の定数(1024)を整数としてキャストします。値の1つを明示的にキャストして、SQL ServerにBIGINTを使用させます。 – Pred

答えて

-1

はちょうどより多くグーグル後にエラーをスローしませんクエリを見つけました。私は/数値、すなわち10進するための値のいずれかを変換する場合は1024がint型であるため、1024.0

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

はい、精度エラーが発生する可能性があります。フロートと実際のデータ型についての記事をドキュメントで読んでください。 SOのSQL Serverの精度エラーを検索するか、お気に入りの検索エンジンを使用していくつかの例を見つけてください。以下はSOの質問の1つです: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

"それはビッグ・インです" - そうではありません。それは '数値'です。コメントのコメントに投稿されたサンプルを参照してください。 –

+0

はい、あなたは正しいです - 数値(13,0) - 私は自分の答えを訂正します。 –

1

をこの場合、SQLは、操作を完了するために、デフォルトではタイプのINTを使用します。これは、結果の値がINTの最大容量(2,147,483,647)をオーバーフローすると、エラーが発生する理由を説明します。

回避策は、あなたのようなBIGINTのvarialbeであなたの操作で使用回数格納することができます

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) 
関連する問題