2016-12-02 12 views
0

case文を持つSQLクエリがあります。 case文には、2つの整数値を加算し、それらの合計がsqlで許される最大整数値より小さいことが検証される条件があります(単純化のために丸められています)。 問題は、合計値がsqlの最大許容整数よりも大きいため、2つの値が追加されるWHEN文では、文全体がSQL算術例外をスローします。私は、私は変数の一つのタイプを変更する場合、私は周りの仕事を見つけた... 2つの整数値を追加するときの合計値は、一時的な整数変数に配置され、内部 例えば、条件が2つの大きな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型に変化し保持するために使用する変数のデータ型を想定しておりますのでBIGINTではなく (すなわち、

Declare @int1 as bigint =2147483598 

) 問題が解決されます。現実には、このクエリは、これらの値が調達されている場所から複数のテーブルを含む、はるかに大きく複雑なストアドプロシージャの一部なので、このソリューションを避けたいと思います。 ありがとうございます。

+0

をBIGINTにキャストしようと、答えの種類を探してるんですか?回避策があります...何が間違っていますか、正確には? – Blorgbeard

+0

このcaseステートメントは、実際には大きなストアドプロシージャの一部であり、2つのテーブルのフィールドがマージされ、このCASEステートメントに基づいてフィールドの1つが更新される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

ありがとうJuan。変数のキャストは問題を解決しました。ちょうど、私は@MAXIntValue変数型を変更する必要はありませんでした。つまり、それは効果がないようです。完全な例をありがとう。 – Shegute

+0

あなたが仕事を言うときでさえ、私はむしろ残念ながら安全です。多分、エンジンがあなたのためにキャスティングをドアの裏側でやっているのかもしれません。 –