TSQL 字符串串联算术溢出错误

TSQL String Concatenation Arithmetic overflow error

我正在使用 sql 服务器 2008 r2。当我 运行 我的查询时,我收到 "Arithmetic overflow error converting expression to data type 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 函数开头的行除外,结果如我所料。如果我只注释掉那一行,其余的注释掉 select,结果就如我所料。当我尝试 select 时,它正在做一些我还不太了解的事情。在此先感谢您帮助理解解决此问题的方法。

您的 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 Arithmetic overflow error converting expression to data type int.

如果您也在 int 的下限之外,也会发生同样的情况。

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

你能试试这样的吗?

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