计算表达式列的值

pbsh mplus 架构师  2010-09-28 03:18:57
这个函数好像是邹老大写的?实际使用中发现如果是对一张表中的某列进行计算后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)'
go

create function f_calc(
@str varchar(1000)--要计算的表达式
)returns sql_variant
as
begin
declare @re sql_variant

declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int

exec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj out
if @err<>0 goto lb_err

exec @err=sp_oasetproperty @obj,'Language','vbscript'
if @err<>0 goto lb_err

exec @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
go



select 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
...全文
135 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pbsh 2010-09-29
hello
回复
pbsh 2010-09-28
仔细想了下,原因是不是这样的:
因为创建OLE对象是在函数内部,所以每计算一行,就会创建一个的'MSScriptControl.ScriptControl'OLE的对象,每一个对象都是独立的,在批处理结束之前,OLE对象不会主动破坏掉,而sp_oacreate 创建的对象上限是256个,所以在257行的时候,未能成功创建OLE对象,所以以后的行都未成功计算。

各位觉得呢?
回复
pbsh 2010-09-28
[Quote=引用 4 楼 happyflystone 的回复:]
exec sp_oadestroy @obj
[/Quote]

石头哥果然高啊!我在这个函数的return前加了exec sp_oadestroy @obj
就没有256行的限制了。

批处理自动破坏令牌难道只能主动破坏256次?多行计算必须主动破坏令牌吗?
石头哥指点下,多谢。
回复
ws_hgo 2010-09-28
这个问题貌似
只有邹老大帮你解决

但是他本人已经归隐啦!
你问下Roy大版
回复
dawugui 2010-09-28
好象确实有问题,

无法在 sysdepends 中添加当前存储过程所对应的行,因为缺少该存储过程所依赖的对象 'sp_oacreate'。仍将创建该存储过程。

帮顶了。
回复
hovy_yang 2010-09-28
[Quote=引用 2 楼 dlut_liuq 的回复:]
不懂
帮顶
蹭分
[/Quote]
等待高手
回复
pbsh 2010-09-28
[Quote=引用 4 楼 happyflystone 的回复:]
exec sp_oadestroy @obj
[/Quote]

循环前先破坏掉之前创建的'MSScriptControl.ScriptControl'对象吗?
回复
-狙击手- 2010-09-28
exec sp_oadestroy @obj
回复
pbsh 2010-09-28
[Quote=引用 1 楼 ws_hgo 的回复:]
不能在程序中修改吗》
[/Quote]

程序员把这个问题扔到了数据库中,只能这么处理了。
回复
飘零一叶 2010-09-28
不懂
帮顶
蹭分
回复
ws_hgo 2010-09-28
不能在程序中修改吗》
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-09-28 03:18
社区公告
暂无公告