您可以使用下面的 SQL 存储过程来计算具有任意数量变量的任何公式的结果:
我在 2012 年写了一个解决方案,它可以使用 SQL SERVER 评估任何类型的数学公式。该解决方案可以处理具有 N 个变量的任何公式:
我被要求找到一种方法来评估用户填写的公式给出的值。公式包含数学运算(加法、乘法、除法和减法) 用于计算公式的参数存储在 SQL 服务器数据库中。
我自己找到的解决方案如下:
假设我有 n 个用于计算公式的参数,这些参数中的每一个都存储在一个数据表的一行中。
包含要在公式中使用的 n 行的数据表称为 tab_value
我必须使用 SQL 游标将在 n 行(在 tab_values 中)中找到的 n 个值存储在一个新表中的一行中,
为此,我创建了一个名为 tab_formula 的新表
在光标中,我将为每个值添加一个新列,列名将是 Id1、Id2、Id3 等。
然后我构建一个包含公式的 SQL 脚本来评估公式
在完成脚本之后,希望您觉得它有用,欢迎您向我询问。
该过程用作输入:
-公式
- 包含用于计算公式的值的表
if exists(select 1 from sysobjects where name='usp_evaluate_formula' and xtype='p')
drop proc usp_evaluate_formula
go
create type type_tab as table(id int identity(1,1),val decimal(10,2))
go
create proc usp_evaluate_formula(@formula as nvarchar(100),@values as type_tab readonly)
as begin
declare @tab_values table (id int, val decimal(10,2))
insert into @tab_values(id,val) select * from @values
declare @id as int declare @val as decimal(10,2)
if not exists(select 1 from sysobjects where name ='tab_formula')
create table tab_formula(id int identity(1,1), formula nvarchar(1000))
if not exists(select 1 from tab_formula where formula=@formula)
insert into tab_formula(formula) values(@formula)
declare c cursor for select id,val from @tab_values
declare @script as nvarchar(4000)
open c
fetch c into @id,@val
while @@fetch_status=0
begin
set @script = 'if not exists(select 1 from syscolumns c inner join sysobjects o on c.id=o.id where o.name=''tab_formula'' and c.name=''id'+
convert(nvarchar(3),@id)+ ''')
alter table tab_formula add id'+convert(nvarchar(3),@id)+ ' decimal(10,2)'
print @script
exec(@script)
set @script='update tab_formula set id'+convert(nvarchar(3),@id)+'='+convert(nvarchar(10),@val)+' where formula='''+@formula+'''' print @script exec(@script) fetch c into @id,@val end close c deallocate c
set @script='select *,convert(decimal(10,2),'+@formula+') "Result" from tab_formula where formula='''+@formula+''''
print @script
exec(@script)
end
go
declare @mytab as type_tab
insert into @mytab(val) values(1.56),(1.5) ,(2.5) ,(32),(1.7) ,(3.3) ,(3.9)
exec usp_evaluate_formula'2*cos(id1)+cos(id2)+cos(id3)+3*cos(id4)+cos(id5)+cos(id6)+cos(id7)/2*cos(Id6)',@mytab
go
drop proc usp_evaluate_formula
drop type type_tab
drop table tab_formula