将nvarchar转换为十进制时,将nvarchar转换为数据类型numeric的算术溢出错误

时间:2014-04-03 09:32:55

标签: sql sql-server

我在sql中有一个列,在某些情况下有时是nvarchar和number。该列的数据类型为nvarchar。我只是感兴趣的地方,其数字,没有数字,我不需要它。我使用下面的案例

(SELECT case when isnumeric(dia) =1   then dia else '' end as days from dbo.Debtor  )

上面的查询工作正常并返回记录,其中是numeric和empty,其中为null。但是,我想将我的记录返回为十进制或浮点数。我因为我希望能够像

那样过滤
SELECT .....
   WHERE EXISTS(
                (SELECT case when isnumeric(dia) =1   
                 then dia else '' end as days from dbo.Debtor  ) > 0

               )

上面只是一个例子,但未经过测试。请问我现在的问题是当我将我的列dia转换为十进制时我得到错误"算术溢出错误将nvarchar转换为数据类型numeric"。

以下是我的查询。

(SELECT case when isnumeric(dia) =1   then
           cast(dia as decimal(3,1))    else 0 end as de from dbo.Debtor  )

请任何帮助将不胜感激。谢谢

4 个答案:

答案 0 :(得分:1)

为了仅评估数值,您需要在part中包含isnumeric。 尝试像

这样的东西
SELECT ISNULL((SELECT cast(dia as decimal(3,1)) from dbo.Debtor WHERE isnumeric(dia) =1 ),0)

答案 1 :(得分:0)

我认为你的dbms在任何情况下都在评估cast(dia as decimal(3,2))。为了避免交换数字检查和强制转换:

SELECT cast(case when isnumeric(dia) = 1 then dia else null end as decimal(3,2)) from dbo.Debtor

答案 2 :(得分:0)

对于遇到此错误的任何人,解决方案都很简单。如果您可以在他的示例中看到,他将使用此转换

cast(dia as decimal(3,1))

例如,他有一个100.0007数据,他的隐式转换将导致上述错误,因为他只希望three(3)个小数点one(1)个数字(3,1)

解决方案是实际检查数据长度并确定您实际需要多少位数。

在大多数情况下,这种转换就足够了。

cast(dia as decimal(18,4))

但是,如果您的数据在小数点后还有更多数字,请根据需要更改转换。

cast(dia as decimal(18,5)) 

以此类推。...

答案 3 :(得分:0)

要理解这个错误,我们需要一些例子,比如插入到表中

Declare @@test table(test numeric(8,2))

但是当你插入超过 8 个字符的数据时 然后出现错误信息

insert into @@test
values ('11190000.1212')
<块引用>

消息 8115,级别 16,状态 8,第 3 行算术溢出错误 将 varchar 转换为数据类型数字。该声明已 终止。