我在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 )
请任何帮助将不胜感激。谢谢
答案 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 转换为数据类型数字。该声明已 终止。