![](/img/trans.png)
[英]How to solve “Arithmetic overflow error converting varchar to data type numeric” error in sql server?
[英]Arithmetic overflow error converting varchar to data type numeric in SQL Server
嘗試進行此轉換時,出現“算術溢出”錯誤:
select convert(numeric(10, 4), '4236575.320000000000000000')
但是可以使用以下命令將其轉換為不帶小數的數字:
select convert(numeric, '4236575.320000000000000000')
這是什么原因呢?
值4236575.320000000000000000
要求數據類型為NUMERIC(25, 18)
4236575.320000000000000000
NUMERIC(25, 18)
因為小數點前有7位數字,小數點后有18位。
話雖如此,只要可以存儲小數點前的部分而不會被截斷,則可以使用較小的精度和小數位數:
SELECT str
, CONVERT(NUMERIC(8, 1), str) AS [ddddddd.d]
, CONVERT(NUMERIC(7, 0), str) AS [ddddddd]
, CONVERT(NUMERIC(9, 2), str) AS [ddddddd.dd]
FROM (VALUES
('4236575.320000000000000000')
) AS tests(str)
結果:
str | ddddddd.d | ddddddd | ddddddd.dd
4236575.320000000000000000 | 4236575.3 | 4236575 | 4236575.32
當您指定numeric(10,4)
您將告訴SQL Server使用精度10,即從小數點兩側存儲的位數,以及小數位數為4(即小數點右邊的4位)。
這實際上意味着最大數量可以是999999.9999(小數點左邊的6位數字,右邊的4位數字)小於4236575.3280,這會使存儲空間溢出。 重要的是,將丟失的數據是最高有效位數,而不是最低有效位數,這就是為什么它會失敗。
您會注意到以下所有成功:
select convert(numeric(11, 4), '4236575.320000000000000000')
select convert(numeric(10, 3), '4236575.320000000000000000')
select convert(numeric(8, 1), '4236575.320000000000000000')
所有這些都允許小數點左邊的7位數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.