2016-05-23 65 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 

奇怪的是,如果我註釋掉我的選擇條款的所有部分,除了有正確的函數開頭的行,結果如我所料。如果我註釋掉那條線並選擇其餘部分,結果如我所料。當我試圖一起選擇它時,它正在做一些我不明白的事情。預先感謝任何幫助瞭解解決此問題的方法。

+1

那些看起來很大量。它可能與使用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

這對我來說很有意義,我改變INT爲bigint和查詢運行完成,與預期結果。只是爲了教育的緣故,有人可以解釋爲什麼自己獨立運行時我原來的線將正常工作,但與選擇其餘字段合併會溢出? – Gavin

0

聽起來像A.PRINCIPALCASHBALANCE * 100的值對於int來說很大。

你可以嘗試這樣的事情嗎?

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