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_executesql
或 EXEC
一起使用。我不记得这些是否可以在 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 Server 中的最高点和最低时间计算排名
翻译SQL最近位置查询语句(MySQLPostgreSQLSQL Server)