将数据类型 varchar 转换为 float 时出错。

xuelangzhk 2008-03-05 10:44:51
有一个表的数据我执行下列语句一切正常
select fkeyid,cast(fkey as float) aaa from TB
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
可以将fkey列的所有值转换为float类型,列中也不存在空值和空字符串

可是做如下改动后就会报这个错误
select * from(
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
) as TB1
where aaa>0
将数据类型 varchar 转换为 float 时出错。
求教大家这是什么问题造成的
...全文
1653 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
JennyZhang2008 2008-06-16
  • 打赏
  • 举报
回复
呵呵,我也遇到相似的问题了,特来学习一下.
nzperfect 2008-03-05
  • 打赏
  • 举报
回复
不要用ISNUMERIC函数
自己写一个判断是否为数字型的函数吧.
nzperfect 2008-03-05
  • 打赏
  • 举报
回复
create table #t(fkeyid int,fkey varchar(10))
insert into #t select 1,''
insert into #t select 1,null
insert into #t select 1,'a'
insert into #t select 1,'5'
insert into #t select 1,'57'
insert into #t select 1,'57e4'
select fkeyid,cast(fkey as float) aaa from #t where ISNUMERIC(Fkey)=1
------------------
1 5
1 57
1 570000
select * from (
select fkeyid,cast(fkey as float) aaa from #t where ISNUMERIC(Fkey)=1
)a where aaa>5
------------------------
消息 8114,级别 16,状态 5,第 1 行
从数据类型 varchar 转换为 float 时出错。

select isnumeric('57e4')
select isnumeric('57e4e')


这就是问题所在
wzy_love_sly 2008-03-05
  • 打赏
  • 举报
回复
where cast(aaa as float)> 0
?
xuelangzhk 2008-03-05
  • 打赏
  • 举报
回复
select * from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
and cast(fkey as float)>0
一开始就是用的这种输写方式单同样报错,所以才单独使用了下面语句调试
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
上面这个语句可以转换执行正常,但只要加上外面的条件aaa>0
select * from(
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
--and ISNUMERIC(Fkey)=1
) as TB1
where aaa>0
就不行了:将数据类型 varchar 转换为 float 时出错。
dawugui 2008-03-05
  • 打赏
  • 举报
回复
select * from
(
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
) as TB1
where cast(fkey as float) > 0
nzperfect 2008-03-05
  • 打赏
  • 举报
回复
set nocount on
select fkeyid,cast(fkey as float) aaa into #t from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
)
select * from #t where aaa> 0
drop table #t
wzy_love_sly 2008-03-05
  • 打赏
  • 举报
回复
不一定就会是数字
wzy_love_sly 2008-03-05
  • 打赏
  • 举报
回复
比如

select ISNUMERIC('$')

1

select cast('$' as float)

从数据类型 varchar 转换为 float 时出错
pt1314917 2008-03-05
  • 打赏
  • 举报
回复

这里也有出错的可能:
select fkeyid,cast(fkey as float) aaa from TCalKey

xuelangzhk 2008-03-05
  • 打赏
  • 举报
回复
select * from(
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
--and ISNUMERIC(Fkey)=1
) as TB1
where aaa>0
注释掉--and ISNUMERIC(Fkey)=1问题依旧存在
将数据类型 varchar 转换为 float 时出错。
jimmyflying 2008-03-05
  • 打赏
  • 举报
回复
select * from(
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
) as TB1
where aaa> 0 问题可能出在红字所标处,
可以改成:cast(fkey as float)>0,因为aaa不可以直接作条件的
xuelangzhk 2008-03-05
  • 打赏
  • 举报
回复
select fkeyid,cast(fkey as float) aaa from TB
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
这样不加外层的aaa> 0 条件判断就不会报错
wzy_love_sly 2008-03-05
  • 打赏
  • 举报
回复
ISNUMERIC的问题吧
dawugui 2008-03-05
  • 打赏
  • 举报
回复
select * from(
select fkeyid,cast(fkey as float) aaa from TCalKey
where fcontrolname in
(
select fcontrolname from tvalue where fvaluetype=1
)
and ISNUMERIC(Fkey)=1
) as TB1
where aaa> 0

--
你的语句没看出错误.

且有:ISNUMERIC(Fkey)=1 这个条件,不知道为何了.
xuelangzhk 2008-03-05
  • 打赏
  • 举报
回复
第一个sql语句的表名错了是TCalKey
发贴时的输写问题,不好意思
dawugui 2008-03-05
  • 打赏
  • 举报
回复
ISNUMERIC
确定表达式是否为一个有效的数字类型。

语法
ISNUMERIC ( expression )

参数
expression

要计算的表达式。

返回类型
int

注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。

示例
A. 使用 ISNUMERIC
下面的示例返回 1,这是因为 zip 列包含有效的数值。

USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO

B. 使用 ISNUMERIC 和 SUBSTRING
下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。

USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO

下面是结果集:

type price
--------------- -------------------------- -----------
The Busy Execut 19.99 0
Cooking with Co 11.95 0
You Can Combat 2.99 0
Straight Talk A 19.99 0
Silicon Valley 19.99 0
The Gourmet Mic 2.99 0
The Psychology (null) 0
But Is It User 22.95 0
Secrets of Sili 20.00 0
Net Etiquette (null) 0
Computer Phobic 21.59 0
Is Anger the En 10.95 0
Life Without Fe 7.00 0
Prolonged Data 19.99 0
Emotional Secur 7.99 0
Onions, Leeks, 20.95 0
Fifty Years in 11.95 0
Sushi, Anyone? 14.99 0

(18 row(s) affected)


wzy_love_sly 2008-03-05
  • 打赏
  • 举报
回复
select cast(fkey as float) from TCalKey
会抱错吗?
gahade 2008-03-05
  • 打赏
  • 举报
回复
上下两个例子的表名都不是一个啊!

是不是TCalKey.fkey有不能转移的行啊?
xuelangzhk 2008-03-05
  • 打赏
  • 举报
回复
谢谢大家 把转换之后的数据先放入临时表问题可解决

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧