数学表达式评估

Posted

技术标签:

【中文标题】数学表达式评估【英文标题】:Mathematical expression evaluation 【发布时间】:2014-02-06 12:37:36 【问题描述】:

我有一个关于字符串表达式评估的问题。目前我正在研究需要从存储在 DB 中的字符串计算数学表达式的项目,我想制作评估此字符串的 C# 方法,并且此函数将从存储过程或添加到 DB 的函数中运行。所以问题是我想在我的 C# 函数中使用已经创建的解决方案,如 NCalc 或 Jace.Net,但是如果我想从 db 运行它,我需要将 dll(例如 NCalc.dll 或 Jace.dll)添加到 db部件。并且添加这些解决方案是相当有问题的,NCalc 使用不安全的代码,Sql server 无法从这个 dll 运行方法,而 Jace 需要许多额外的 dll 需要添加到 DB,这是不可接受的解决方案。因此,如果有人知道可以添加到数据库并运行的工作表达式评估器?提前谢谢帮助。

我正在使用 Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 2) 和 .Net framework 4.5

【问题讨论】:

您的计算有多复杂?简单的 + - / * ( ) 可以使用 XPathDocument 完成,也可以自己编写。这些可以在托管代码中没有任何第三方 dll 的情况下运行。见answers.unity3d.com/questions/34349/… 类似这样的东西: int[] table = 1, 2, 3, 4, 5 ; int[] table2 = 1, 3, 4, 5, 7, 100 ; var output = Formula.Evaluate("[x] 假设您有 clr 函数“评估”。您能否演示如何从 T-SQL 调用它?很多事情都应该清楚了。例如你将如何将数组传递给 CLR 函数? @RomanPokrovskij 这是一个简单的 C# 示例,我如何尝试运行表达式评估 [Microsoft.SqlServer.Server.SqlFunction] public static SqlDouble FN_STD_Calc_Evaluate() Expression exp = new Expression("2+2" );返回 SqlDouble.Parse(exp.Evaluate().ToString());这是 sql 中的代码:select dbo.FN_STD_Calc_Evaluate() 这是结果:Msg 6522, Level 16, State 2, Line 1 NCalc.EvaluationException: Attempted to perform an operation was denied by the CLR host. 你将如何传递数组来计算平均值?以这种方式计算表达式有什么问题: DECLARE @_sql nvarchar(max), @_base nvarchar(max)='SELECT ', @_expression nvarchar(max) = '2+2';设置@_sql=@_base+@_表达式;执行(@_sql)? 【参考方案1】:

A.我认为您可以将嵌入 javascript 引擎加入您的兴趣圈。

例如http://jurassic.codeplex.com/ - 纯 dotnet,一个 dll,简单易用(但仍需要 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”。

【讨论】:

从你发给我的链接中阅读文章后,一切都变得更加清晰,NCalc 使用静态属性进行缓存。如果您想将您的程序集添加为安全程序集,则禁止静态非只读属性,在对代码进行一些更改(删除静态属性)后一切正常。添加程序集时还有更多限制,但在我的情况下,这似乎是至关重要的。谢谢帮助。 最后一件事,您可以通过两种方式更改程序集权限集: 1. 从 sql management studio,转到 Database->Programmability->Assemblies->ex “Unrestricted”(可以使用静态运行程序集)字段)。 2. 进入项目(SQL Server 数据库项目)->references->rmb on assebly->Permission Set -> Safe/External/Unsafe

以上是关于数学表达式评估的主要内容,如果未能解决你的问题,请参考以下文章

从字符串评估数学表达式并将其插入堆栈

Bash:评估一个数学术语?

C ++业务规则表达式解析器/评估[关闭]

如何取出包含数学表达式并给出结果的字符串的某些部分

CMake中math的使用

评估前缀表达式的算法?