Sql 为什么我的十进制值不能转换为6,4?

Sql 为什么我的十进制值不能转换为6,4?,sql,tsql,Sql,Tsql,我在查询结果的一列中有一组十进制值,它们都是以下格式: _._ _ _ _ _ _ 小数点前1个整数,小数点后6个整数 列中的值可能为NULL 以下是这些值的一些示例: 4.010000 3.800000 1.260000 0.650000 0.010000 0.000000 NULL 当我将查询中的select语句更改为将此列中的值转换为小数6,4时,出现以下错误: Arithmetic overflow error converting numeric to data type num

我在查询结果的一列中有一组十进制值,它们都是以下格式:

_._ _ _ _ _ _ 
小数点前1个整数,小数点后6个整数

列中的值可能为NULL

以下是这些值的一些示例:

4.010000
3.800000
1.260000
0.650000
0.010000
0.000000
NULL
当我将查询中的select语句更改为将此列中的值转换为小数6,4时,出现以下错误:

Arithmetic overflow error converting numeric to data type numeric.
为什么我会犯这个错误


谢谢。

问题中发布的值(包括空值)将转换为小数6,4。该错误来自大于等于100的值

例如,以下所有操作都会成功:

SELECT CONVERT(DECIMAL(6, 4), 4.010000)
SELECT CONVERT(DECIMAL(6, 4), 3.800000)
SELECT CONVERT(DECIMAL(6, 4), 1.260000)
SELECT CONVERT(DECIMAL(6, 4), 0.650000)
SELECT CONVERT(DECIMAL(6, 4), 0.010000)
SELECT CONVERT(DECIMAL(6, 4), 0.000000)
SELECT CONVERT(DECIMAL(6, 4), NULL)
现在试试:

SELECT CONVERT(DECIMAL(6, 4), 100)
您将获得:

Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting int to data type numeric.
小数点6,4表示:共6位数字,其中4位在小数点的右边。 因此:XX.yyy 最大值:99.9999

因此,要么尝试:

小数点7,4,以在小数点左侧获得另一个数字,同时保持小数点右侧为4 小数点6,3,保留6个总数字,但小数点右侧少一位,以便在小数点左侧多加一位。
您的值大于99.9999,总共包含6位数字,包括小数点

从表中获取最大值,检查小数点后的总位数,然后尝试将其转换为适合该最大值

SELECT MAX(data) FROM Table1

以下是:

SET NUMERIC_ROUNDABORT ON
SELECT CONVERT(DECIMAL(6, 4), 4.010000)
生成您报告的错误。我只是说这是一个可能的原因
问题的答案。

根据注释,如果表中有886条注释,则可以使用以下查询

Select Convert(Decimal(20,4), YourColumn)
From   YourTable
Where   YourColumnIs NULL 
    OR (
            Convert(Decimal(20,4), YourColumn) < 10 
            And 
            Convert(Decimal(20,4), YourColumn) > -10
        )
如果列的数据类型已经是数字数据类型,则可以删除where子句中的convert函数


另外,请注意,我在where子句中使用了<10,因为这似乎是您想要的,但是您可以将其更改为<100,并且仍然只能得到可以转换为小数6,4的值

请发布您的代码。这些值不会造成问题或导致错误。您要从中选择的列的数据类型是什么?该字段的最大值是多少?任何小数点左边有3位数字的东西,即从100.000开始的值,都会导致该错误。@joey Kleingers,您似乎有一些值大于999.999,因此无法转换为小数点6,4,获取最大值并进行检查。很遗憾,我无法发布代码,但我有降序排列的值。有两个值不是我在上面列出的格式886.000000和59.530000。我从查询中排除了这两行,现在我的降序列表从4.010000变为0.000000,最后剩下的行为空。然而,当我将查询更改为将所有整数转换为小数6,4时,仍然会出现相同的错误。这可能是问题所在,但默认设置为OFF,因此我想我们需要等待,看看OP的最大值是多少;-。不幸的是,我不能发布代码,但我有降序排列的值。有两个值不是我在上面列出的格式886.000000和59.530000。我从查询中排除了这两行,现在我的降序列表从4.010000变为0.000000,最后剩下的行为空。然而,当我改变查询将所有整数转换为小数6,4时,我仍然会得到相同的错误。我在select语句中使用这段代码:CASTL.USERCHAR4作为小数6,4我想可能select在WHERE之前执行,这意味着它仍然包括886.000000数字,但是显然WHERE子句是先执行的,所以这不是问题所在。@JoeyKleingers:事实上是的,它可能是查询优化器在执行筛选操作之前将这些值推送通过的。让我试试。PS:59.530000应该是小数点6,4的罚款。只有886值才是问题所在。有趣。除了更改值/删除行之外,还有其他解决方法吗?我很困惑,因为在过滤器之后,我有一个应该可以转换的值列表,但它仍然给了我那个错误。尽管我在一个单独的健全性检查查询中检查了最大值和最小值,但它们转换得很好。@JoeyKleingers:太好了。尝试将Try_u添加到CONVERT的左侧,使其为:Try_CONVERT。如果这有效,我会用它更新我的答案。
Select Convert(Decimal(20,4), YourColumn)
From   YourTable
Where   YourColumnIs NULL 
    OR (
            Convert(Decimal(20,4), YourColumn) < 10 
            And 
            Convert(Decimal(20,4), YourColumn) > -10
        )