【问题标题】:SQL Server 2014: Converting a Decimal(18,0) to a Decimal(18,5)SQL Server 2014:将小数 (18,0) 转换为小数 (18,5)
【发布时间】:2017-12-09 17:03:02
【问题描述】:

因此,由于以前在特定数据库中工作的人犯了一个错误,我有一个列应该是 Decimal(18,5),但实际上是 Decimal(18,0)。 (如果您不指定精度和小数位数,这显然是 SQL Server 的默认设置。)

我添加了一个适当类型的新列,但多次尝试进行转换,如下所示:

UPDATE [Case].[TableThatWasBuiltWrong] SET NewDecimalValue = 
CONVERT(DECIMAL(18,5), OldDecimalValue)

这会返回一个算术溢出错误——虽然严格正确,但我并不关心(我已经验证目前没有任何数据超过 5 位小数,更不用说预期的 13 位限制了)。

鉴于这种情况,如何将 OldDecimalValue 的内容转化为 NewDecimalValue?

(修改为实际使用中的SQL Server版本)

【问题讨论】:

  • 显然有数据超过了这个限制。
  • 为什么不直接改变原始列呢?无论如何,有些东西超过了这个限制,很可能是 13 位数字部分。运行它并检查select max(len(floor(OldDecimalValue))) from TableThatWasBuiltWrong。结果是 > 13 吗?
  • @scsimon 我认为SELECT MAX(OldDecimalValue), MIN(OldDecimalValue) 就足够了
  • @M.Ali 但是...为什么?,要求是将其转换为decimal(18,5)
  • 没有 SQL Server 2015 - 我们有 SQL Server 2000、2005、2008、2008 R2、2012、2014、2016 和 2017 正在开发中 - 你是哪一个指的是??

标签: sql-server type-conversion


【解决方案1】:

如果您的值小于或等于 9999999999999.49999

,则应该没有问题

查看示例:

DECLARE @val DECIMAL(18,0)=9999999999999.49999
SELECT @val dec1,CAST(@val AS DECIMAL(18,5)) dec2

结果

但是超过这个限制,即使停留在 18.5 范围内,也会导致错误。

以下在限制范围内,但将通过异常:

DECLARE @val DECIMAL(18,0)=9999999999999.59999
SELECT @val dec1,CAST(@val AS DECIMAL(18,5)) dec2

将通过:

【讨论】:

  • 这是因为在转换时,SQL Server 正在尝试舍入它?
  • 是的,但那是因为通过执行DECIMAL(18,0)=9999999999999.59999,您将其隐式四舍五入为10000000000000
  • 同意。但我相信他想将数据从 18,0 转换为 18,5。对吗?
  • 意图是从 18,0 到 18,5,是的。结果可能是我上面列出的 SQL 错误?
  • @ErikOttosen 这不是很理想,但当然可以使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多