下面这个函数的影响范围怎么只有255行,下面这个表单Tb_UinonConfig 有500行,使用函数f_calc()计算后1-256行可以正确计算结果,到257行以后计算到的结果都是NULL,这是什么原因呢?/*================================*/
/* Table: Tb_UinonConfig          */
/*================================*/
create table Tb_UinonConfig(
prim1 real
arithmetic varvhar(50)
)
go------------------------------------------------
/*--计算表达式的函数计算给定算术表达式的值此方法由VB版 hhjjhjhj(大头) 
提供的VB处理程序程序上改造而来--邹建 2004.07(引用请注明此信息)--*//*--调用示例select dbo.f_calc('123+456')
--*/
create 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

解决方案 »

  1.   

    prim1 real
    arithmetic varvhar(50)select dbo.f_calc(CAST(prim1 AS varchar)+arithmetic)from Tb_UinonConfig
      

  2.   

    因为从257行开始,进入了"lb_err:"处理分支。
      

  3.   

    跟数据没关系,跟扩展存储过程调用的DLL有关,可能是限制了同时只允许起256个。
      

  4.   

    和数据没关系。就是吧这个函数重复执行500次,到256次后就没结果了,我用的语句是
    select dbo.f_calc('48.00'+tb_unionconfig.arithmetic) from tb_list, tb_unionclass
    其中表tb_list是一个500行的表,只是测试时临时用来描述执行次数的,
      

  5.   

    跟数据没关系,跟扩展存储过程调用的DLL有关,可能是限制了同时只允许起256个。----
      

  6.   

    在if @err=0 return(@re)前追加一下一句
    exec sp_oadestroy @obj
    如下ALTER  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
    exec sp_oadestroy @obj
    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
      

  7.   

    搂主结论:可能外部DLL问题,最后我还是使用了游标,游标并不慢,上百万条数据遍历一次大约只要20秒以内