日期:2014-05-18 浏览次数:20605 次
--> 测试数据:[tbl]
go
if object_id('[tbl]') is not null
drop table [tbl]
go
create table [tbl](
[ID] int,
[guige] varchar(11),
[shuliang] numeric(5,3)
)
go
insert [tbl]
select 1,'1*5',5.2 union all
select 2,'1.0/5',3 union all
select 3,'1/5',5 union all
select 4,'2*5+3',8 union all
select 5,'(8-5)*3',-5.213
declare @minid int
declare @maxid int
select @minid=MIN(id) from tbl
select @maxid=max(id) from tbl
go
declare @sql varchar(max)
set @sql=''
declare @minid int
select @minid=MIN(ID) from tbl
declare @maxid int
select @maxid=max(ID) from tbl
declare @str varchar(1000)
set @str=''
while @minid<=@maxid
begin
select @str='('+[guige]+')' from tbl
where ID=@minid
select @str='select id,guige,shuliang,'
+@str+'*[shuliang] as heji
from tbl where ID='+cast(@minid as varchar)
print @str
set @sql=@sql+' union all '+@str
set @minid=@minid+1
end
print @sql
set @sql=RIGHT(@sql,LEN(@sql)-10)
exec(@sql)
/*
id guige shuliang heji
1 1*5 5.200 26.000000000
2 1.0/5 3.000 0.600000000
3 1/5 5.000 0.000000000
4 2*5+3 8.000 104.000000000
5 (8-5)*3 -5.213 -46.917000000
*/
------解决方案--------------------
declare @T table (ID int,guige char(7),shuliang decimal(18,3))
insert into @T
select 1,'1*5',5.2 union all
select 2,'1.0/5',3 union all
select 3,'1/5',5 union all
select 4,'2*5+3',8 union all
select 5,'(8-5)*3',-5.213
select *,dbo.m_charcompute(guige+'*('+ltrim(shuliang)+')') as newcol
from @T
/*
ID guige shuliang newcol
----------- ------- --------------------------------------- ----------------------
1 1*5 5.200 26
2 1.0/5 3.000 0.6
3 1/5 5.000 1
4 2*5+3 8.000 34
5 (8-5)*3 -5.213 -46.917
*/
create function [dbo].[m_charcompute](@bds varchar(1000))
returns float
as
BEGIN
set @bds = replace(@bds,' ','')--去空格,免得麻烦。
declare @i int,@j int
declare @c1 char(1),@c2 char(1),@c varchar(100)
declare @v1 float,@v2 float,@v float
declare @t table(id int identity(1,1),s varchar(100))
declare @s table(id int identity(1,1),s varchar(100))
declare @sv table(id int identity(1,1),v float)
select @i = 0,@j = len(@bds),@c2 = '',@c = ''
while @i<@j
begin
select @c1 = @c2,@i = @i+1
select @c2 = substring(@bds,@i,1)
if charindex(@c2,'.0123456789') > 0 or (@c2 = '-' and @c1 in('','*','-','+','/','('))
begin select @c = @c + @c2 continue end
if @c <> '' begin insert @t(s) select @c select @c = '' end
if charindex(@c2,')')>0
begin
insert @t(s) select s from @s where id > isnull((select max(id) from @s where s in('(')),0) order by id desc
delete @s where id >= isnull((select max(id) from @s where s in('(')),0)
continue
end
if charindex(@c2,'+-)')>0
begin
insert @t(s) select s from @s where id > isnull((select max(id) from @s where s in('(')),0) order by id desc
delete @s where id > isnull((select max(id) from @s where s in('(')),0)
if @c2 <> ')' insert @s(s) select @c2
continue
end
if charindex(@c2,'*/')>0
begin
insert @t(s) select s from @s where id > isnull((select max(id) from @s where s in('(','+','-')),0) order by id desc
delete @s where id > isnull((select max(id) from @s where s in('(','+','-')),0)
insert @s select @c2
continue
end
if charindex(@c2,'(')>0 insert @s select @c2
e