【发布时间】:2025-11-21 13:30:01
【问题描述】:
这个很简单。为什么下面的代码会导致下面的错误?
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.
根据decimal(p, s) 上的MSDN documentation,p(或在我的情况下为 10)是“可以存储的十进制数字的最大总数,小数点”,而s(在我的例子中是9)是“最大可以存储在右侧的小数位数小数点。”
我的号码,50,总共只有 2 位数字(小于 最大值 10),小数点右侧有 0 位数字(小于 最大值 em> 9),因此它应该可以工作。
我发现this question 基本上是同一问题,但没有人解释为什么文档似乎与行为冲突。似乎s 维度实际上被解释为小数点右侧的固定位数,并从p中减去 em> 数字,在我的情况下,剩下 10 - 9 = 只剩下 1 位来处理左侧。
任何人都可以提供一种合理的方式来解释所编写的文档以匹配行为吗?
编辑:
我在下面看到了一些解释,但它们没有解决文档措辞的根本问题。我建议改变措辞:
对于“p(精度)”,将“可存储的小数位数的最大总数”更改为“将存储的小数位数的最大总数”。
并且对于“s(刻度)”更改“小数点右侧可以存储的最大小数位数。”为“将存储在小数点右侧的小数位数。从 p 中减去此数字以确定小数点左侧的最大位数。” p>
除非有人有更好的解释,否则我将向 Connect 提交错误报告。
【问题讨论】:
-
MS 回复了我的错误报告,现在按照我的建议更新了 SQL Server 2012 的文档。见connect.microsoft.com/SQLServer/feedback/details/760495。拿那个,downvoters! :P
标签: sql-server sql-server-2008