【问题标题】:Computed column based on another computed column?基于另一个计算列的计算列?
【发布时间】:2010-12-23 02:25:13
【问题描述】:

我有一个名为 Cost 的计算列返回钱。

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

【问题讨论】:

    标签: sql-server-2005 calculated-columns


    【解决方案1】:

    计算列不能引用其他计算列。尽管您应该能够重复您想要引用的表达式。 From MSDN:

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

    我还应该补充一点,如果这如您所愿,它将带来您必须处理的各种新问题。目前,跨许多列/行的更新是并行和原子地发生的。

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

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

    【讨论】:

    • ... 它会带来各种新问题 ... 唯一的问题是防止循环引用(两个计算列相互引用),这必须无论如何都要阻止服务器支持它,因为它必须确定计算列的顺序。
    【解决方案2】:

    你必须定义它against the base columns in the table

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多