2014-02-06 221 views
1

我有一個關於字符串表達式評估的問題。目前,我正在處理需要從存儲在數據庫中的字符串中計算數學表達式的項目,我想讓C#方法評估此字符串,並且此函數將從存儲過程或添加到數據庫的函數運行。所以問題是我想在我的C#函數中使用已經創建的解決方案,如NCalc或Jace.Net,但是如果我想從db運行它,我需要將dll(例如NCalc.dll或Jace.dll)添加到db部件。並且添加這些解決方案是相當有問題的,NCalc使用不安全的代碼,並且Sql服務器不能從該dll運行方法,而Jace需要許多額外的dll,需要將其添加到數據庫中,這是不可接受的解決方案。因此,如果任何人知道可以添加到數據庫並運行的工作表達式評估器? Thx提前尋求幫助。數學表達式評估

我使用Microsoft SQL Server 2012(SP1) - 11.0.3128.0(X64)2)和.NET Framework 4.5

+0

您的計算有多複雜?簡單的+ -/*()可以使用XPathDocument來完成,或者你可以編寫你自己的。這些可以在託管代碼中沒有任何第三方dll的情況下運行。請參閱http://answers.unity3d.com/questions/34349/how-to-evaluate-a-mathematical-expression-in-unity.html – Maarten

+1

類似這樣的: int [] table = {1,2,3, 4,5}; int [] table2 = {1,3,4,5,7,100};公式.Evaluate(「(Avg([x]))/ [y] + Max([z])」,表格,10,table2),10); 這是相當複雜的,在將來我需要能夠使用像FFT或STDEV計算 – blindepl

+0

假設你有clr函數「評估」。你能證明你將如何從T-SQL中調用它嗎?許多事情應該變得清楚。例如你如何將數組傳遞給CLR函數? –

回答

0

A.我想你可以包括嵌入的JavaScript引擎的圈子你興趣..

eg (但仍然需要WITH PERMISSION_SET = UNSAFE/EXTERNAL_ACCESS,並且我認爲沒有爲CLR庫特別設計的需要UNSAFE,例如靜態非只讀字段變爲UNSAFE就足夠了,其他限制:http://msdn.microsoft.com/en-us/library/ms403273.aspx)。

B.不要忘記,T-SQL也是動態語言。爲什麼你不能只保存你的表達式在T-SQL中?恕我直言,Sql Server比運行CLR漏洞的任何表達式評估器更適合運行「Avg」。

+1

在閱讀您發送給我的鏈接文章後,所有內容都變得更加清晰,NCalc使用靜態屬性進行緩存。靜態不只讀屬性是禁止的,如果你想添加你的程序集作爲安全的,在做了一些代碼更改(刪除靜態屬性)後,一切正常。添加裝配時有更多的限制,但在我看來,這是一個至關重要的問題。 Thx尋求幫助。 – blindepl

+0

最後一件事,你可以用兩種方式更改程序集權限集: 1.從sql管理工作室轉到數據庫 - >可編程性 - >程序集 - >前「無限制」(可以使用靜態字段運行程序集)。 2.轉到項目(SQL Server數據庫項目) - >引用 - >人民幣彙編 - >權限設置 - >安全/外部/不安全 – blindepl