22,298
社区成员




--用乌龟的
DECLARE @Test TABLE (chvData CHAR(32))
INSERT INTO @Test
SELECT '3*8'
UNION ALL
SELECT '1+3/5'
UNION ALL
SELECT '6/2+10'
select
dbo.f_calc(replace(replace(chvData,'×','*'),'÷','/')) as chvData
from @Test
if object_id('test')is not null drop table test
go
create TABLE test(chvData CHAR(32))
INSERT INTO Test
SELECT '3*8'
UNION ALL
SELECT '1+3'
UNION ALL
SELECT '6/2'
declare @s varchar(4000)
set @s=''
select @s=@s+' select chvData='+chvData+' union all' from Test
set @s=left(@s,len(@s)-10)
exec(@s)
/*
chvData
-----------
24
4
3
(3 個資料列受到影響)
*/
DECLARE @Test TABLE (chvData CHAR(32))
INSERT INTO @Test
SELECT 3*8
UNION ALL
SELECT 1+3
UNION ALL
SELECT 6/2
SELECT * FROM @Test
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
/*
autoid col
----------- -----------
1 1
2 1
3 2
4 2
*/
DECLARE @Test TABLE (chvData CHAR(32))
INSERT INTO @Test
SELECT 3*8
UNION ALL
SELECT 1+3
UNION ALL
SELECT 6/2