我正在使用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函数开头的行,结果就像我期望的那样。如果我注释掉那一行并选择其余部分,结果就像我期望的那样。当我尝试一起选择它时,它正在做一些我不太了解的事情。提前感谢您解决此问题的任何帮助。
答案 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'