基于另一个计算列的计算列?

时间:2009-12-04 02:06:09

标签: sql-server-2005 calculated-columns

我有一个名为Cost的计算列,可以返还资金。

我想要另一个返回(Cost * 2)的列,但它不允许我。

2 个答案:

答案 0 :(得分:16)

计算列不能引用其他计算列。虽然你应该能够重复你想要引用的表达。 From MSDN

  

计算列是根据可以使用同一表中其他列的表达式计算的。表达式可以是非计算列名,常量,函数以及由一个或多个运算符连接的任何组合。表达式不能是子查询。

我还应该补充一点,如果按照您的意愿这样做,它会提出您必须处理的各种新问题。目前,许多列/行的更新以并行和原子方式发生。

因此,在计算中使用计算列是没有意义的,因为它还没有确切的值......如果有的话,你将使用旧的,未更新的值。

如果你真的想避免重复表达,你可以在触发器中执行此操作,但我强烈建议你这样做。触发器并不好玩,只有在极少数情况下才会被精明的人使用。

答案 1 :(得分:6)

您必须定义against the base columns in the table

  

computed_column_expression是一个   定义a的值的表达式   计算列。计算列是   不是的虚拟列   物理存储在表中,除非   该列标记为PERSISTED。该   列是从表达式计算的   它使用相同的其他列   表。例如,计算列   可以有定义:成本AS价格   *数量。表达式可以是非计算列名,常量,   功能,变量和任何   这些组合由一个连接起来   或更多运营商。表达方式   不能是子查询或包含别名   数据类型。

虽然您可以重构它们以使用相同的标量UDF(传入所有相同的列)以便于维护并确保逻辑的一致性,但性能损失将是巨大的,并且我仅使用标量UDF作为最后的手段。