插入记录 "将数据类型 varchar 转换为 float 时出错"

MAKTY 2010-12-14 10:19:22
我原来程序用sql2000 写了一段存储过程,执行数据插入操作,最近程序平台升级,sql2000升级为sql2005,同样的程序,同样的存储过程,结果报出来 "将数据类型 varchar 转换为 float 时出错" 用vs2008 跟踪存储过程无果。头疼。代码发出来请各位帮忙看下。

+ $exception {"从数据类型 varchar 转换为 float 时出错。"} System.Exception {KY.AP.DataServices.DataServiceException}
prjSht "1q" string
colorset "1" string
ucolorset "1" string
drptype "" string
iWangXu 1 int
grp "" string
BucketType "" string
Nd 1.0 float
Jian 0.0 float
YongLiang "0" string
iType 0 int
imateriel "2BLN分散蓝~3.33/H2RL分散黄棕~6.67/SE3R分散金黄~10" string
+ ex {"从数据类型 varchar 转换为 float 时出错。"} System.Exception {KY.AP.DataServices.DataServiceException}
result false bool

---------------------------------------
---这里是拆分字符串写的方法

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go





ALTER function [dbo].[f_splitstr](@SourceSql varchar(8000),@StrSeprate varchar(100))
returns @temp table(id int IDENTITY (1, 1) NOT NULL ,F1 varchar(100))
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(@StrSeprate,@SourceSql,1)-1)
insert @temp(F1) values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(@StrSeprate,@SourceSql,1),'')
end
return --断点调试是这里报错
end


------------------------------------------
---这里是插入存储过程

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go




ALTER PROCEDURE [dbo].[ERPrecipeSaveSub]
@colorid nvarchar(50), --套色ID
@imateriel nvarchar(500) --物料配方
as

set nocount on

declare @result nvarchar(50) --ERP导入数据返回结果
declare @materiel nvarchar(50) --配方物料
declare @recipeid nvarchar(50) --配方自动生成的id
declare @mtrid int --配方物料ID
declare @qty float --配方物料数量


----将配方导入================================================----------------------

--定义临时表=======

Declare @clr_new_temp Table
(id int IDENTITY (1, 1) NOT NULL ,
yrd varchar(32) NULL ,
num float NOT NULL
)



declare @yrd_t nvarchar(100)
declare @num_t float
declare @yrd_tmp nvarchar(500)
declare @num_tmp int
declare @num_rows int
declare @vsc float
declare @alkali float
declare @type int
declare @planweight float


DECLARE recipe_materiela CURSOR FOR
select F1 from dbo.f_splitstr(@imateriel,'/')

OPEN recipe_materiela
FETCH NEXT FROM recipe_materiela
INTO @yrd_tmp

WHILE @@FETCH_STATUS = 0
BEGIN

select top 1 @yrd_t=rtrim(ltrim(F1)) from dbo.f_splitstr(@yrd_tmp,'~') order by id asc
select top 1 @num_t=rtrim(ltrim(F1)) from dbo.f_splitstr(@yrd_tmp,'~') order by id desc


Insert Into @clr_new_temp(yrd,num) values(@yrd_t,@num_t)

FETCH NEXT FROM recipe_materiela INTO @yrd_tmp
END


CLOSE recipe_materiela
DEALLOCATE recipe_materiela


----===============================================================

if(exists(select * from clr_recipe where clrid=@colorid))
begin
delete from clr_recipe where clrid=@colorid
end


select @vsc=vsc, @alkali=alkali,@type=type ,@planweight=planweight from clr_colorset where id=@colorid

insert into clr_recipeid (clrid,num,psnid,vsc,alkali,dat,type,test)
values (@colorid,1,6,@vsc,@alkali,getdate(),@type,@planweight)
select @recipeid=scope_identity()


DECLARE recipe_materiel CURSOR FOR
SELECT yrd,num FROM @clr_new_temp

OPEN recipe_materiel

---循环开始
FETCH NEXT FROM recipe_materiel
INTO @materiel,@qty

WHILE @@FETCH_STATUS = 0
BEGIN


if (not exists(select * from clr_materiel where yrd = @materiel))
begin
select @result = 'ERROR!该配方物料不存在!---' + @materiel
--select result=@result
raiserror (@result,16,-1)
--return
end
else
begin
select @mtrid=id from clr_materiel where yrd = @materiel

insert into clr_recipe_record (clrid,rcpid,mtrid,qty) values (@colorid,@recipeid,@mtrid,@qty)

insert into clr_recipe (clrid,rcpid,psnid,dat,mtrid,vsc,num) values (@colorid,@recipeid,'6',getdate(),@mtrid,'0',@qty)
end


FETCH NEXT FROM recipe_materiel INTO @materiel,@qty
END

--循环结束

CLOSE recipe_materiel
DEALLOCATE recipe_materiel


------------------============================================--------


...全文
834 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxwcoco 2011-08-23
  • 打赏
  • 举报
回复
看一下 学习学习
MAKTY 2010-12-16
  • 打赏
  • 举报
回复
唉 散分结贴 只能varchar凑合这用了
MAKTY 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 guguda2008 的回复:]
引用 12 楼 makty 的回复:

谢谢大家帮忙 继续在线等结果

注:我测试数据是第一段代码,
方法处理的字符串为“2BLN分散蓝~3.33/H2RL分散黄棕~6.67/SE3R分散金黄~10”

怎么调用的,发上来看看
[/Quote]

晕倒 昨晚家里竟然断网了。。。

vs2005里面不是可以调试存储过程吗 直接调试 参数输进去和调试c#程序一样单步跑就好了。现在我暂时把里面的float换成varchar(50),倒是可以用,不过就是想不明白为什么sql2005对这个varchar转换float的过程报错,如果Insert语句的话varchar类型是可以直接插入float字段里面的啊
yy1987316 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guguda2008 的回复:]
这种错误一般是因为把字符串默认转换成数字时因为有非法数值比如ABC报错,检查你的表中有没有这样的值,可以用ISNUMERIC(COL)=0,或者 COL LIKE '%[^0-9.]%'检查名为COL的列
[/Quote]
guguda2008 2010-12-14
  • 打赏
  • 举报
回复
这种错误一般是因为把字符串默认转换成数字时因为有非法数值比如ABC报错,检查你的表中有没有这样的值,可以用ISNUMERIC(COL)=0,或者 COL LIKE '%[^0-9.]%'检查名为COL的列
Rockets_NBA 2010-12-14
  • 打赏
  • 举报
回复
可以在select 之前,加个
print @yrd_tmp 看看是什么
Rockets_NBA 2010-12-14
  • 打赏
  • 举报
回复
declare @num_t float  这个是float 

select top 1 @num_t=rtrim(ltrim(F1)) from dbo.f_splitstr(@yrd_tmp,'~') order by id desc

赋值的时候是字符型,是不是这里的问题



注,看你这个语句,感觉没有必要用function
guguda2008 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 makty 的回复:]

谢谢大家帮忙 继续在线等结果

注:我测试数据是第一段代码,
方法处理的字符串为“2BLN分散蓝~3.33/H2RL分散黄棕~6.67/SE3R分散金黄~10”
[/Quote]
怎么调用的,发上来看看
MAKTY 2010-12-14
  • 打赏
  • 举报
回复
谢谢大家帮忙 继续在线等结果

注:我测试数据是第一段代码,
方法处理的字符串为“2BLN分散蓝~3.33/H2RL分散黄棕~6.67/SE3R分散金黄~10”


guguda2008 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 makty 的回复:]

引用 4 楼 guguda2008 的回复:
这种错误一般是因为把字符串默认转换成数字时因为有非法数值比如ABC报错,检查你的表中有没有这样的值,可以用ISNUMERIC(COL)=0,或者 COL LIKE '%[^0-9.]%'检查名为COL的列


我断点调过,没有字符传进去啊。而且我发帖后加上isnull 和 convert 处理过 ,还是报出同样错误。
而且错误是我方法最后r……
[/Quote]
太长的存储过程很难调试,你把各功能段拆开,用同样的测试数据分别调试再看看输出是否正常。
MAKTY 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guguda2008 的回复:]
这种错误一般是因为把字符串默认转换成数字时因为有非法数值比如ABC报错,检查你的表中有没有这样的值,可以用ISNUMERIC(COL)=0,或者 COL LIKE '%[^0-9.]%'检查名为COL的列
[/Quote]

我断点调过,没有字符传进去啊。而且我发帖后加上isnull 和 convert 处理过 ,还是报出同样错误。
而且错误是我方法最后return字段就报错跳出调试了

主要灵异的是我同样的数据,连接到我sql2000就什么事都没有。。。。
难道2000和2005处理数据转换异常有什么不同?
MAKTY 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 rockets_nba 的回复:]
SQL code
declare @num_t float 这个是float

select top 1 @num_t=rtrim(ltrim(F1)) from dbo.f_splitstr(@yrd_tmp,'~') order by id desc

赋值的时候是字符型,是不是这里的问题



注,看你这个语句,感觉没有必要用function
[/Quote]

写function主要是还有几个地方要用到这个字符串处理方法,sql不能传数组(最少我不会),我就都是固定格式字符串进来再解析掉

因为sql2005可以断点调试
function 里面
begin
set @ch=left(@SourceSql,charindex(@StrSeprate,@SourceSql,1)-1)
insert @temp(F1) values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(@StrSeprate,@SourceSql,1),'')
end
return --断点调试是这里报错
执行的这里就跳出 varchar 转float错误

我第一段是测试数据和错误返回信息,function里面我虚拟表@temp 内容为2BLN分散蓝,3.33

select top 1 @yrd_t=rtrim(ltrim(F1)) from dbo.f_splitstr(@yrd_tmp,'~') order by id asc
select top 1 @num_t=rtrim(ltrim(F1)) from dbo.f_splitstr(@yrd_tmp,'~') order by id desc

我这里第一段赋值@yrd_t没问题
后一段赋值@num_t就错了

我加了isnull判断 和convert 转换还是报错 搞不明白了
MAKTY 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 billpu 的回复:]
刚刚看了看 不管是2000还是2005的 varchar到float都是支持隐式转换
那说明很可能你的数据有问题的
[/Quote]

这个我倒是知道,关键是同样的东西2000执行没问题,放到2005就出错了。灵异事件?
billpu 2010-12-14
  • 打赏
  • 举报
回复
刚刚看了看 不管是2000还是2005的 varchar到float都是支持隐式转换
那说明很可能你的数据有问题的
dawugui 2010-12-14
  • 打赏
  • 举报
回复
将数据类型 varchar 转换为 float 时出错

这种错误是你的数据不正确,varchar类型的数据不能转换为float型,例如:A,B99等.

你可以使用isnumric(varchar型数据) = 1来进行判断.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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