日期:2014-05-18  浏览次数:20416 次

动态公式以及计算结果
SQL code

create table #tb(FName varchar(10) , FWebPrice varchar(100),FA varchar(100),FB  varchar(100) )
insert into #tb values('地区A','@SMM_Pb1','FWebPrice*3','FA+3')
insert into #tb values('地区B','@SMM_Pb2','(@SMM_Pb1+@SMM_Pb2)/2','@SMM_Pb1+FA')
 
declare @SMM_Pb1  numeric(15,2) 
declare @SMM_Pb2  numeric(15,2) 
select @SMM_Pb1=11
select @SMM_Pb2=22 

select * from #tb

怎么得出计算结果.

公式是动态的,所以请问这个的动态语句怎么写?(要考虑到记录数可能很多,公式可能长点,拼接语句的话可能超过长度哦)




------解决方案--------------------
你慢慢等人给你拼吧,公式里面还在嵌套字段名称,不是那么一句话的事情
------解决方案--------------------
变态的设计,我有一个办法,你去建临时表,一个字段一个字段的拼接出来往表里面查:

我试了一下,没写完,我也想不到别的办法,看别人吧。
我还是把我的给你贴出来:

SQL code

create table #tb(
FName varchar(10) ,
FWebPrice varchar(100),
FA varchar(100),
FB  varchar(100) 
)
insert into #tb values('地区A','@SMM_Pb1','FWebPrice*3','FA+3')
insert into #tb values('地区B','@SMM_Pb2','(@SMM_Pb1+@SMM_Pb2)/2','@SMM_Pb1+FA')

--先解决FWebPrice字段
create table #test
(
FName varchar(10) ,
FWebPrice int,
FA varchar(100),
FB  varchar(100) 
)
go
declare @str varchar(max)
set @str=''
select @str=@str+' when FWebPrice='+QUOTENAME(FWebPrice,'''')+' then '+FWebPrice from #tb
set @str='
declare @SMM_Pb1  numeric(15,2) 
declare @SMM_Pb2  numeric(15,2) 
select @SMM_Pb1=11
select @SMM_Pb2=22 
insert #test 
select FName,case '+@str+' end,FA,FB from #tb'
print @str
exec(@str)

select * from #test
go
--创建临时表,以#test为元数据表拼接一下语句,解决FA字段:
declare @str2 varchar(max)
set @str2=''
declare @str3 varchar(max)
set @str3=''

select @str2=@str2+' when FA='+QUOTENAME(FA,'''')+' then '+FA from #test
set @str2=',case '+@str2+' end'
select @str3=@str3+' when FB='+QUOTENAME(FB,'''')+' then '+FB from #test
set @str3=',case '+@str3+' end'

set @str2='
declare @SMM_Pb1  numeric(15,2) 
declare @SMM_Pb2  numeric(15,2) 
select @SMM_Pb1=11
select @SMM_Pb2=22 
select FName,FWebPrice'
+@str2+@str3
+' from #test'
print @str2
exec(@str2)


declare @SMM_Pb1  numeric(15,2) 
declare @SMM_Pb2  numeric(15,2) 
select @SMM_Pb1=11
select @SMM_Pb2=22
select FName,
FWebPrice,case  when FA='FWebPrice*3' 
then FWebPrice*3 when FA='(@SMM_Pb1+@SMM_Pb2)/2' 
then (@SMM_Pb1+@SMM_Pb2)/2 end,
case  when FB='FA+3' then FA+3 
when FB='@SMM_Pb1+FA' then @SMM_Pb1+FA end from #test

------解决方案--------------------
SQL code

------------------听说参数是固定的,那就用了个偷懒的写法,试试吧,能不能满足你的情况。

--计算
create procedure sp_CalcExpression
@Expression varchar(8000)
,@ decimal(15,2) out
as
declare @sql nvarchar(4000)
set @sql = N'set @ = ' + @Expression
exec SP_EXECUTESQL @sql ,N'@ decimal(15,2) out', @ out
go


--先解决FWebPrice字段
create table #test
(
FName varchar(10) ,
FWebPrice varchar(100),
FWebPriceVal int,
FA varchar(max),
FB  varchar(max) 
)
go
declare @str varchar(max)
set @str=''
select @str=@str+' when FWebPrice='+QUOTENAME(FWebPrice,'''')+' then '+FWebPrice from #tb
set @str='
declare @SMM_Pb1  numeric(15,2) 
declare @SMM_Pb2  numeric(15,2) 
select @SMM_Pb1=11
select @SMM_Pb2=22 
insert #test 
select FName,FWebPrice,FWebPriceVal=case '+@str+' end, 
FA,FB from #tb'
exec(@str)
go
declare @SMM_Pb1  numeric(15,2) 
declare @SMM_Pb2  numeric(15,2) 
select @SMM_Pb1=11,@SMM_Pb2=22 
declare mycursor cursor
for
select FName,FWebPriceVal,
    FA=replace(replace(replace(FA,'@SMM_Pb1',@SMM_Pb1),'@SMM_Pb2',@SMM_Pb2),'FWebPrice','('+cast(FWebPriceVal as varchar(10))+')'),
    FB=replace(replace(replace(replace(FB,'@SMM_Pb1',@SMM_Pb1),'@SMM_Pb2',@SMM_Pb2),'FWebPrice','('+cast(FWebPriceVal as varchar(10))+')'),
    'FA','('+replace(replace(replace(FA,'@SMM_Pb1',@SMM_Pb1),'@SMM_Pb2',@SMM_Pb2),'FWebPrice','('+cast(FWebPriceVal as varchar(10))+')')+')')
from #test
open mycursor
select FName,FWebPrice,FA,FB into #tmp from #test where 1<>1
declare @FName varchar(10)