这个函数好像是邹老大写的?实际使用中发现如果是对一张表中的某列进行计算后Update,会出现每次只能修改256行,且在一次批处理中,无法连续生效。
例如:1000行数据需要修改,直接使用Update tablename set col1= f_calc(col1)的方式修改col1列的值,会发现只修改了前256行,即使你写一个循环,仍然只有第一次修改生效,但是语句不会报错。感觉像是sp_oamethod的问题?--------------------------------------------------------------------------------------------------------------计算表达式的值create table Tb_UinonConfig(prim1 real,arithmetic varchar(50))
insert into Tb_UinonConfig select 100,'+20.5×15÷13.1'
insert into Tb_UinonConfig select 80 ,'÷2.5×100+23.0'
insert into Tb_UinonConfig select -80,'+100+(23.0×6)'
gocreate function f_calc(
@str varchar(1000)--要计算的表达式
)returns sql_variant
as
begin
declare @re sql_variantdeclare @err int,@src varchar(255),@desc varchar(255)
declare @obj intexec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj out
if @err<>0 goto lb_errexec @err=sp_oasetproperty @obj,'Language','vbscript'
if @err<>0 goto lb_errexec @err=sp_oamethod @obj,'Eval',@re out,@str
if @err=0 return(@re)lb_err:
exec sp_oageterrorinfo NULL, @src out, @desc out 
declare @errb varbinary(4),@s varchar(20)
set @errb=cast(@err as varbinary(4))
exec master..xp_varbintohexstr @errb,@s out
return('错误号: '+@s+char(13)+'错误源: '+@src+char(13)+'错误描述: '+@desc)
end
goselect prim1,arithmetic,
dbo.f_calc(cast(prim1 as varchar)+replace(replace(arithmetic,'×','*'),'÷','/')) as col from Tb_UinonConfig
drop function f_calc
drop table Tb_UinonConfig

解决方案 »

  1.   

    exec sp_oadestroy @obj 
      

  2.   


    循环前先破坏掉之前创建的'MSScriptControl.ScriptControl'对象吗?
      

  3.   

    这个问题貌似
    只有邹老大帮你解决但是他本人已经归隐啦!
    你问下Roy大版
      

  4.   


    石头哥果然高啊!我在这个函数的return前加了exec sp_oadestroy @obj
    就没有256行的限制了。批处理自动破坏令牌难道只能主动破坏256次?多行计算必须主动破坏令牌吗?
    石头哥指点下,多谢。
      

  5.   

    仔细想了下,原因是不是这样的:
    因为创建OLE对象是在函数内部,所以每计算一行,就会创建一个的'MSScriptControl.ScriptControl'OLE的对象,每一个对象都是独立的,在批处理结束之前,OLE对象不会主动破坏掉,而sp_oacreate 创建的对象上限是256个,所以在257行的时候,未能成功创建OLE对象,所以以后的行都未成功计算。各位觉得呢?