SQL Server - 如何根据动态公式执行计算

Posted

技术标签:

【中文标题】SQL Server - 如何根据动态公式执行计算【英文标题】:SQL Server - How to perform a calculation based on a dynamic formula 【发布时间】:2016-01-07 15:45:32 【问题描述】:

我有一种情况需要根据列中的特定条目执行动态计算。

表格看起来像:

DECLARE Temp TABLE (
        Id INT, 
        Name NVARCHAR(255),
        Const1 DECIMAL(18,10),
        Const2 DECIMAL(18,10),
        Const3 DECIMAL(18,10),
        Const4 DECIMAL(18,10)
    );

我想添加一个名为“计算”的字段。用户必须在该字段中指定如何应用常量(即“Const1 * Const2 + (Const3 - Const4)”)。

我有一个对公式进行硬编码的函数,但我希望能够将表格列动态映射到“计算”字段。这可能吗?如果我得到一个表格条目,例如:

ID| Name         | Const1 | Const2 | Const3 | Const4 | Calculation
1 | Calculation1 |      5 |      3 |      2 |      9 | Const1 * Const2 + (Const3 - Const4)

然后在我的函数中,我可以动态地进行计算并将其作为输出返回吗?我是否以正确的方式解决这个问题?

提前致谢!

【问题讨论】:

你试过了吗? @Tom H 我在新字段中添加了如上所述的公式。我正在尝试找出如何根据 varchar 列条目映射到列名。 在数据库层的上一层做这个不是更好吗? @TT。它会,但是有一个外部系统依赖于标量函数提供的值。我无法控制它。他们希望能够提取计算值。 您是否有机会插入这些行并存储计算而不是公式? SQL 并不是为这种事情而设计的。它有风险、脆弱且效率极低。 【参考方案1】:

您需要将动态 SQL 与 sp_executesqlEXEC 一起使用。我不记得这些是否可以在 UDF 中使用,并且有一些问题需要注意,例如 SQL 注入和可能的性能问题。我没有时间测试这在 UDT 中是否有效,但你会想要这样的东西:

DECLARE @sql VARCHAR(MAX)

SELECT @sql = 'SELECT ' + REPLACE(REPLACE(Calculation, 'Const1', Const1), 'Const2', Const2)... + ' AS result'
FROM My_Table
WHERE ID = 1

EXEC(@sql)

【讨论】:

这本来会很棒,但不幸的是,动态 SQL 似乎无法在 UDF 中使用。 看来确实如此。如果您与使用函数相关联,我不确定还有哪些其他解决方案。我假设您的计算比简单的常量数学更复杂? 计算相当简单。最多可以使用十个常数,但这仍然是简单的数学运算。如果没有对这个函数的依赖,我愿意使用存储过程而不是 UDF,但不幸的是,在我的情况下这不是一个简单的任务。 是否有理由不能将结果存储在表中并从那里简单地选择它? UDF 有几个参数,用于动态生成几个集成到公式中的值(来自其他函数)。因此,我无法将结果存储在表格中。

以上是关于SQL Server - 如何根据动态公式执行计算的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 的 clr 存储过程中执行动态 .net 代码

SQL计算年龄

如何根据 SQL Server 中的最高点和最低时间计算排名

翻译SQL最近位置查询语句(MySQLPostgreSQLSQL Server)

SQL Server - 如何根据将插入数据半小时的表中的几个参数来计算持续时间?

SQL sever 2008 如何根据一个表中的两个时间计算出时间差