2016-01-07 48 views
2

我有一种情况,我需要根据列中的特定条目执行动态计算。SQL Server - 如何根据动态公式执行计算

表看起来像:

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) 

然后在我的功能,我可以动态地进行计算并返回作为输出?我以正确的方式处理这个问题吗?

提前致谢!

+0

您是否尝试过任何操作? –

+0

@Tom H我已经在新字段中添加了如上所述的公式。我试图找出如何基于varchar列条目映射到列名称。 – RizJa

+1

在数据库层之上的层中做这件事会更好吗? –

回答

5

您需要使用动态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) 
+0

这将是惊人的,但不幸的是,它看起来像动态SQL不能在UDF中使用。 – RizJa

+0

看起来确实如此。如果您使用某个函数,我不确定可能有哪些其他解决方案。我假设你的计算更复杂,然后只是简单的数学常量? –

+0

计算相当简单。有多达十个常量可以使用,但它仍然是简单的数学。如果没有这个函数的依赖关系,我可以使用存储过程而不是UDF,但不幸的是,对我来说这不是一个简单的任务。 – RizJa