整数乗算の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)データ型に変換します。
をうん、まあそれは、算術オーバーフローが結果を格納するためのメモリが不足しているものです。 –
エラーメッセージはかなり明白です - 式をデータ型intに変換する算術オーバーフローエラー。おそらく、intは32ビットであり、1024^4 ==(2^10)^ 4 == 2^40は32ビット整数(2^32)の範囲を超えます –
'SELECT CAST(1024 AS BIGINT)* 1024 * 1024 * 1024' < - SQL Serverは、小数点以下の定数(1024)を整数としてキャストします。値の1つを明示的にキャストして、SQL ServerにBIGINTを使用させます。 – Pred