2016-05-23 50 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'