Вы можете использовать хранимую процедуру SQL ниже, чтобы вычислить результат любой формулы с любым количеством переменных:
В 2012 году я написал решение, которое может оценивать математические формулы любого типа с использованием SQL SERVER. Решение может обрабатывать любую формулу с N переменными:
Меня попросили найти способ оценить значение, заданное формулой, которая заполняется пользователем. Формула содержит математические операции (сложение, умножение, деление и вычитание). Параметры, используемые для вычисления формулы, хранятся в базе данных SQL сервера.
Решение, которое я нашел для себя, было следующим:
Предположим, у меня есть n параметров, используемых для расчета формулы, каждый из этих параметров хранится в одной строке в одной таблице данных.
Таблица данных, содержащая n строк для использования в формуле, называется tab_value.
Мне нужно сохранить n значений, найденных в n строках (в tab_values) в одной строке в одной новой таблице, используя курсор SQL,
для этого я создаю новую таблицу с именем 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
person
Kemal AL GAZZAH
schedule
31.08.2016