假設我有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