TSQL字符串连接算术溢出错误

时间:2016-05-23 13:04:02

标签: sql-server sql-server-2008-r2 string-concatenation

我正在使用sql server 2008 r2。当我运行查询时,我收到"算术溢出错误将表达式转换为数据类型int。"我怀疑问题出在以RIGHT函数开头的部分。这是整个查询。

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 'T4@'
        ELSE 'T3@'
    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

奇怪的是,如果我注释掉select子句的所有部分,除了以RIGHT函数开头的行,结果就像我期望的那样。如果我注释掉那一行并选择其余部分,结果就像我期望的那样。当我尝试一起选择它时,它正在做一些我不太了解的事情。提前感谢您解决此问题的任何帮助。

2 个答案:

答案 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))

然后我们得到错误

  

Msg 8115,Level 16,State 2,Line 1   将表达式转换为数据类型int的算术溢出错误。

如果你超出int的下限,也会发生同样的情况。

答案 1 :(得分:0)

听起来像A.PRINCIPALCASHBALANCE * 100的值对于int来说是大的。

你能尝试这样的事吗?

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