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

14

我有一个计算列叫做Cost,它返回货币值。

我想要另外一个列返回(Cost * 2)的结果,但是不允许我这样做。

2个回答

18

计算列不能引用其他计算列。虽然您可以重复要引用的表达式。来自 MSDN 的说明

计算列是从可以使用同一表中的其他列的表达式计算而来。该表达式可以是非计算列名称、常量、函数以及任何一组由一个或多个运算符连接起来的这些内容。该表达式不能是子查询。

我还应补充一点,如果它按照你所希望的那样工作,将会出现各种新问题需要处理。目前,在许多列/行之间进行更新是并行和原子的。

因此,在您的计算中使用计算列并不合理,因为它实际上没有值...尚未。如果有什么问题,您可能会使用旧的、未更新的值。

如果您真的想避免重复表达式,则可以在触发器中执行此操作,但我强烈建议您不要这样做。触发器不好玩,只有极为熟练的人在极少数情况下才应使用。


它会带来各种新问题。唯一的问题是要防止循环引用(即两个计算列相互引用),这也必须被防止,因为服务器必须确定计算列的计算顺序。 - Trisped

6

您必须根据表中的基本列对其进行定义

computed_column_expression是定义计算列值的表达式。计算列是一种虚拟列,除非该列标记为PERSISTED,否则不会在表中物理存储。该列从使用同一张表中的其他列构建的表达式中计算而来。例如,计算列可以有如下定义:cost AS price * qty。表达式可以是非计算列名称、常量、函数、变量以及一个或多个操作符相连接的任何组合。表达式不能是子查询或包含别名数据类型。

尽管您可以将它们都重构为使用相同的标量UDF(传入所有相同的列)以便进行更轻松的维护并确保逻辑的一致性,但性能损失将是巨大的,因此我只在最后一步才使用标量UDF。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接