2016-05-23 21 views
0

私はSQL Server 2008 r2を使用しています。クエリを実行すると、式をデータ型intに変換する算術オーバーフローエラーが発生します。私は問題がRIGHT関数で始まる部分にあると思う。ここでは、全体のクエリです。TSQL文字列連結算術オーバーフローエラー

SELECT 
    'AA' + --BANK NUMBER 
    TDAccountNumber + --ACCOUNT NUMBER 
    '   ' + --SECURITY NUMBER 
    '  ' + --POSTING DATE 
    RIGHT('0000000000000' + CONVERT(VARCHAR(13),CONVERT(INT,ABS(A.PRINCIPALCASHBALANCE * 100))),13) + --INCOME CASH AMOUNT 
    '0000000000000' + --PRINCIPAL CASH AMOUNT 
    '640' + --TAX CODE 
    ' ' + --REG CODE 
    ' ' + --STATEMENT PRINT CODE 
    '     ' + --SPACES 
    CASE 
     WHEN A.PRINCIPALCASHBALANCE > 0 THEN '[email protected]' 
     ELSE '[email protected]' 
    END + --TRAN CODE 
    CHAR(13) + CHAR(10) + --NEW LINE 
    'AA' + --BANK NUMBER 
    TDAccountNumber + --ACCOUNT NUMBER 
    '   ' + --SECURITY NUMBER 
    'TRANSFER FROM PRINCIPAL TO INCOME ' + --DESCRIPTION 
    '      ' + --SPACES 
    CASE 
     WHEN A.PRINCIPALCASHBALANCE > 0 THEN 'T4B' 
     ELSE 'T3B' 
    END --TRAN CODE 

    FROM 
     TableName 

奇妙な部分は、私がRIGHT機能で始まる行を除いて、私のselect句のすべての部分をコメントアウトした場合、私は期待して、その結果であるということです。私がその行をコメントアウトして残りを選択すると、結果は私が期待した通りです。私はそれをすべて一緒に選択しようとすると、私がまだ理解していないことをしています。この問題を回避する方法を理解する助けを前もってありがとう。

+1

かなり大きな数字のようです。 intの代わりにbigintを使うのと同じくらい簡単かもしれません。 intは、数字+21億を保持しています。 https://msdn.microsoft.com/en-us/library/ms187745.aspx –

+0

フォルトを再作成するサンプルレコードをいくつか提供できますか?フィールドのデータ型を含めることもできれば便利です。 –

答えて

2

A.PRINCIPALCASHBALANCE(100を掛けた場合)の値は、intの最大サイズを単純にオーバーフローしています。

the docs状態では、intが保持できる最大値は2,147,483,647です。したがって、あなたが持っているものを壊してちょうだいにすると、次のようになります。

select CONVERT(INT,ABS(21474836 * 100)) 

それはうまくいきます。我々はそれがオーバーフローすることを変更する場合は、:

select CONVERT(INT,ABS(21474837 * 100)) 

をその後、我々は、エラーを取得

メッセージ8115、レベル16、状態2、行1つの 算術オーバーフローエラーデータ型intに式を変換します。

intの下限を超えている場合も同じことが起こります。

+0

あなたは私が持っている以上のすべての点をカバーしていますので、私は自分の答えを削除し、あなたをアップアップします。 – Bridge

+0

それは私には意味があります、私はBIGINTにINTを変更し、クエリは期待どおりの結果で完了まで実行されます。教育目的のために、なぜ私の元の行が単独で実行されるとうまくいくのか説明できますが、残りの選択フィールドと組み合わせてオーバーフローしますか? – Gavin

0

A.PRINCIPALCASHBALANCE * 100の値のような音は、intでは大きな値になります。

あなたはこれを試すことができますか?

SELECT RIGHT('00000000000' + CONVERT(VARCHAR(11),CONVERT(INT,ABS(A.PRINCIPALCASHBALANCE))),11)+'00'