我有一个非常常见的问题,但我通常的解决方案是行不通的。我有一个高度精确的值存储为临时表中的字符。当我将它推送到它的最终目的地时,数据类型为数字(38,38)的列失败。我认为这是因为负号,但当我摆脱它时,我仍然有一个问题。我已经将数字列最大化但我仍然收到以下错误: 将nvarchar转换为数据类型numeric的算术溢出错误。
通常情况下,我只是转换为浮动,但这不起作用。除此之外,我想保留值的精确度,而浮动似乎就是把它带走了。
我在这里缺少什么?
DECLARE @Value NVARCHAR(255) = '-1.000000000000000'
SELECT CAST(@Value AS numeric(38,38))
DECLARE @Value NVARCHAR(255) = '-1.000000000000000'
SELECT CAST(CAST(@Value AS FLOAT) AS numeric(38,38))
澄清: numeric(38,38)是荒谬的参数,仅用于测试和此问题的示例。原始列设置为数字(16,15),在数百万条记录的数据集上工作时间超过99%,因此没有标记为问题。
答案 0 :(得分:3)
numeric(38,38)是38位的数字值,其中38位在小数点后面。因此,任何大于1或小于-1的数字(小数点左边有1位或更多位数)都会溢出。您需要考虑小数点左侧和右侧可能出现的最大位数。
1.00001将是6位数的数字(6,5),其中5位于小数点右侧,其中1位于左侧。
10.00001将是7位数的数字(7,5),其中5位于小数点右侧,其中2位于左侧。