Вы можете использовать хранимую процедуру SQL ниже для вычисления результата любой формулы с любым количеством переменных:
Я написал в 2012 году решение, которое может оценивать математические формулы любого типа, используя SQL SERVER.Решение может обрабатывать любую формулу с N переменными:
Меня попросили найти способ оценить значение, заданное формулой, которое заполняется пользователем.Формула содержит математические операции (сложение, умножение, деление и вычитание). Параметры, используемые для вычисления формулы, хранятся в БАЗЕ ДАННЫХ сервера SQL.
Решение, которое я нашел сам, было следующим:
Предположим, у меня есть n параметров, используемых для вычисления формулы, каждый из этих параметров хранится в одной строке в одной таблице данных.
Таблица данных, содержащая n строк для использования вформула называется tab_value
Мне нужно сохранить n значений, найденных в n строках (в tab_values) в одной строке в одной новой таблице, используя курсор SQL,
для этого я создаю новую таблицу с именем tab_formula
В курсоре я добавлю новый столбец для каждого значения, имя столбца будет Id1, Id2,Id3 и т. Д.
Затем я создаю сценарий SQL, содержащий формулу для оценки формулы
Здесь, после полного сценария, я надеюсь, вы найдетеэто полезно,вы можете спросить меня об этом.
Процедура использует в качестве входных данных:
-Формулу
-А таблица, содержащая значения, используемые для расчета формулы
если существует (выберите 1 из системных объектов, где name = 'usp_evaluate_formula' и xtype = 'p') drop proc usp_evaluate_formula go
создайте тип type_tab в виде таблицы (id int identity (1,1), val decimal (10,2)) go create proc usp_evaluate_formula (@formula как nvarchar (100), @ значения как type_tab только для чтения) как начало --KAMEL GAZZAH --kamelgazzah@gmail.com --05 / 09/2016
объявить таблицу @tab_values (id int, val decimal (10,2))
удалить из @tab_values вставить в @tab_values (id, val) select * from @values
объявить @id как int объявить @val как десятичное (10,2)
, если не существует (выберите 1 из системных объектов, где name = 'tab_formula') создать таблицу tab_formula (id int identity (1,1), формулаnvarchar (1000)), если не существует (выберите 1 из tab_formula, где формула = @ формула) вставить в tab_formula (значения формулы) (@formula)
объявить курсор c для выбора идентификатора, val из @tab_values объявить @script как nvarchar (4000) открыть c извлечь c в @ id, @ val в то время как @@ fetch_status = 0begin set @script = 'если не существует (выберите 1 из системных столбцов c системными объектами внутреннего объединения o на c.id = o.id где o.name =' 'tab_formula' 'и c.name =' 'id' + convert (nvarchar)(3), @ id) + '' ') изменить таблицу tab_formula добавить id' + convert (nvarchar (3), @ id) + 'decimal (10,2)' print @script exec (@script) set @ script =«обновить таб_формулу set id» + convert (nvarchar (3), @ id) + '=' + convert (nvarchar (10), @ val) + ', где формула =' '' + @ формула + '' '' print @scriptexec (@script) извлекает c в @ id, @ val end close c освобождает c
set @ script = 'select *, конвертирует (десятичное (10,2),' + @ формула + ') "Result"из tab_formula, где формула = '' '+ @ формула +' '' 'печать @script exec (@script)
end
go
объявить @mytab как вставку type_tab в@mytab (val) значения (1.56) вставляют в @mytab (val) значения (15) вставляют в @mytab (val) значения (25) вставляютt в значения @mytab (val) (32) вставить в значения @mytab (val) (17) вставить в значения @mytab (val) (33) вставить в значения @mytab (val) (37,9)
exec usp_evaluate_formula'cos (id1) + cos (id2) + cos (id3) + cos (id4) + cos (id5) + cos (id6) + cos (id7) / cos (Id6) ', @ mytab
go drop proc usp_evaluate_formula drop type type_tab drop table tab_formula