假设我有n个用于计算式的参数,这些参数的每被存储在一个行中的一个数据表。 - 包含要在公式中使用的n行的数据表称为tab_value - 我必须在一个新表中使用SQL游标 - 将n行(在tab_values中)中找到的n个值存储在一行中我创建一个名为tab_formula的新表格 - 在游标中,我将为每个值添加一个新列,列名称将为Id1,Id2,Id3等。 - 然后我构造一个SQL脚本,其中包含公式以评估公式
如果存在的值 -The式 -A表(从系统对象选择1其中name = 'usp_evaluate_formula' 和的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 开始 --KAMEL GAZZAH [email protected] --05/09/2016
声明@tab_values表(ID INT,VAL十进制(10,2))
从@tab_values删除插入@tab_values(ID,VAL) SELECT * FROM @values
声明@id为INT声明@val为十进制(10,2)
如果不存在(选择1从系统对象,其中name =” tab_formula') create table tab_formula(id int identity(1,1),式为nvarchar(1000)) 如果不存在(来自tab_formula选择1其中式= @式)插入到 tab_formula(式)的值(@formula)
c声明光标选择ID,从VAL声明@tab_values @脚本为 nvarchar(4000)打开c将文件提取到@id,@val而@@ fetch_status = 0 开始设置@script ='如果不存在(从syscolumns中选择1内部 在c.id = o上加入sysobjects o .id其中o.name =''tab_formula''和 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)+'其中 公式='''+ @ formula +''''print @script exec(@script)将c取回为 @ id,@ val end close c deallocate c
set @ script ='select *,convert(decimal(10 ,2), '+ @式+') “结果” 从tab_formula其中式= '' '+ @式+' ''”打印@Script EXEC(@Script)
端
去
声明@mytab作为type_tab插入@mytab(VAL)的值(1.56)插入到 @mytab(VAL)的值(15)插入到@mytab(VAL)的值(25)插入到 @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降型type_tab降表 tab_formula
的可能重复的[存储在数据库式(方程式)将在后面进行评估(SQL Server 2005中)](http://stackoverflow.com/questions/9722782/storing-formula-方程式在数据库中要评估后来sql-server-2005) – Pondlife 2012-03-26 11:25:51
你说你有一个工作的CLR功能,但“需要避免”它。如果你能解释原因,这将有所帮助; TSQL不是一个很好的语言,你可能会遇到更多的问题,而不仅仅是使用CLR。 – Pondlife 2012-03-26 11:26:57
我试图避免CLR获得性能和安全原因 – PraveenVenu 2012-03-27 04:26:55