从数据类型 varchar 转换为 numeric 时出错。怎么处理?

losobobo 2015-03-28 01:55:37
背景介绍:
  我处理的是txt文件,txt文件的样式:

一直没法导入,后来一位大牛告诉我说是因为我的txt文件是用asc文件转过来的,本来asc文件是有换行符的,但是window不承认,所以他就说用16进制代替换行符就行了-----------导入果真成功了。

问题描述:
我需要统计的是第三列中所有正数(>0)的和, 我的主要数据是这个样子的:


我的代码如下:

代码上半部分就是导入txt文件。下半部分就是统计工作。

但是得到的结果是:

所以这是为什么?怎么办?请教诸位!
...全文
1978 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Neo_whl 2015-03-30
  • 打赏
  • 举报
回复
引用
@u011015550 直接是 列名3 吗? 代码带入显示 列名3 无效。

你不是将txt文档导入到数据库里面了么?
导入到什么数据库是哪个你知道么?

use 数据库名
go

select * from 导入的数据的表名 --会显示你导入数据的结果集啊,如果没有,你是否具有修改该表的权限呢,改改该表

--可以先替换掉里面的e+

update #y280 set 列名3=replace(列名3,'e+','0')     --我说的列名3只是个假设,具体要看你处理的字段名,如果确实没有字段名这种情况,用列名3肯定是不行的,那建议你可以考虑用导入向导导入数据,可以新建好表再导入txt文档中的数据,方便后面处理

----如果你只要显示不小于0的数据
--然后通过where语句删选即可啊

select * from #y280 where 列名3>0

Tiger_Zhao 2015-03-30
  • 打赏
  • 举报
回复
;WITH t1 AS (
SELECT Reverse(...) as sz -- 先不要转换
FROM #y2801
)
,t2 AS (
SELECT CASE WHEN ISNUMERIC(sz)=1 THEN
cast(sz AS decimal(12,8))
ELSE
NULL -- 反正最后不统计,用 NULL 好了
END AS sz
FROM t1
)
SELECT ... -- 统计
FROM t2
WHERE sz > 0.0
正牌风哥 2015-03-30
  • 打赏
  • 举报
回复
用float类型,导入再转换
losobobo 2015-03-30
  • 打赏
  • 举报
回复
@u011015550 直接是 列名3 吗? 代码带入显示 列名3 无效。
發糞塗牆 2015-03-30
  • 打赏
  • 举报
回复
用case when对数据进行判断,搭配isnumeric 函数,如果能转的才转,不能转的再处理。
losobobo 2015-03-30
  • 打赏
  • 举报
回复
最终解决我的问题了。结帖。
losobobo 2015-03-29
  • 打赏
  • 举报
回复
可以给导入的txt文件创建的表命名字段名吗?我导入txt文件的代码上面已有,该怎么命名字段名呢?
Neo_whl 2015-03-29
  • 打赏
  • 举报
回复

select * from #y280   --查查该表,都有字段的,没有给也会是列名1,列名2等

update  #y280 set    列名3=replace(列名3,‘e+’,‘0’)
losobobo 2015-03-28
  • 打赏
  • 举报
回复
在网上找到 代码是 update table set 字段=replace(字段,‘-3.40282346638529e+038’,‘0’) 但是这里的字段名要写什么呢? 我总不能直接贴上”-3.40282346638529e+038“吧,那样的话 负号是不能识别的呀。
losobobo 2015-03-28
  • 打赏
  • 举报
回复
那我想把 txt文件中的 “-3.40282346638529e+038” 直接替换成 数字 0. 并且保存。 用sql 语句该怎么做呢?有没有谁能告诉我,我对sql 语句很不熟悉。谢谢。
Neo_whl 2015-03-28
  • 打赏
  • 举报
回复

--sql中处理的话用replace(exp1,exp2,exp3)似乎满足你说的

           select replace('23473843848e+394384','e+','00')  
losobobo 2015-03-28
  • 打赏
  • 举报
回复
现在我想问的是,有没有什么办法可以将“e+” 给删除掉,或者 替换成0 。因为我只需要大于0的数据,而所有含“e+”的数据都是负数,是系统认定的负值。 另外,我用pilotedit想将e+ 替换成0,但是显示memory pool: fail to allocate 4096 memory pool. 我觉得是因为我的文件都太大了,普遍在5G以上。 所以想问下 有没有好办法。
Neo_whl 2015-03-28
  • 打赏
  • 举报
回复
错误信息提示很明显,数据类型转化失败,由于你的字段没给出,我猜测你在tex文档中的数据所在字段值应该是文本,包含了字母e,+等符号,是不能直接转换为numeric数据类型的

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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