这个很简单。为什么下面的代码会导致下面的错误?
declare @dTest decimal(10, 9)
set @dTest = 50
错误:
Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.
根据MSDN 文档,decimal(p, s)
(p
或在我的情况下为 10)是“可以存储的小数点左侧和右侧的十进制数字的最大总数”,而s
(或在我的情况下为 9)是"小数点右侧可存储的最大小数位数。"
我的号码 50 总共只有 2 位数字(小于最大10)和小数点右侧的 0 位数字(小于最大9),因此它应该可以工作。
我发现这个问题基本上是同一个问题,但没有人解释为什么文档似乎与行为冲突。看起来s
维度实际上被解释为小数点右侧的固定位数,并从p数中减去,在我的情况下,剩下 10 - 9 = 仅剩下 1 位来处理左侧。
任何人都可以提供一种合理的方式来解释为匹配行为而编写的文档吗?
编辑:
我在下面看到了一些解释,但它们并没有解决文档措辞的根本问题。我建议改变措辞:
对于“p(精度)”,将“可以存储的小数位数的最大总数”更改为“将存储的小数位数的最大总数”。
并且对于“s(刻度)”更改“可以存储到小数点右侧的最大小数位数”。到“将存储在小数点右侧的小数位数。从 p 中减去该数字以确定小数点左侧的最大位数。”
除非有人有更好的解释,否则我将向 Connect 提交错误报告。