SQL Server 中的计算列是什么?

发布于

在SQL Server中,计算列是使用表达式计算其值的虚拟列。

计算列通常会在其计算中使用来自其他列的数据。如果任何这些列中的数据被更新,计算列将在其计算中自动反映更新。

计算列示例

+————+————-+————+——— ——–+ | 个人ID | 名字 | 姓氏 | 全名 | |————+————-+————+——— ——–| | 1 | 荷马 | 宋飞 | 荷马宋飞 | | 2 | 巴特 | 科斯坦萨 | 巴特·科斯坦萨 | | 3 | 玛格 | 克莱默 | 玛格克莱默 | +————+————-+————+——— ——–+

在此示例中,该FullName列是计算列。它连接FirstName和LastName列中的值以计算全名。

如果没有计算列,如果要选择全名,则需要执行以下操作:

选择名字 + ’ ’ + 姓氏作为全名 从人;

或者您可以使用该CONCAT()功能,如下所示:

SELECT CONCAT(FirstName, ’ ‘, LastName) AS FullName 从人;

每次您想从表中选择全名时,都需要在查询中包含串联。

但是通过使用像上面这样的计算列,你可以这样做:

选择全名 从人;

计算列的好处

计算列可以在编写查询时节省时间,减少错误,甚至提高性能。

如果您发现自己一遍又一遍地重复运行相同的查询,尤其是当该查询基于很少更改的业务规则时,计算列会很方便。

上一个示例中的计算列可以在以后为我们节省大量时间,因为我们不需要在每次要选择某人的全名时连接名字和姓氏。

用例示例

计算列可能有用的示例包括:

  • 根据另一列中的出生日期计算一个人的年龄
  • 连接名字和姓氏,基于名字在一个列中,姓氏在另一列中
  • 根据一列中的库存产品数量和另一列中的价格计算产品的库存价值
  • 根据另一列中的身高和体重计算一个人的 BMI(身体质量指数)
  • 创建一个“排名”列,根据其他列中的值对行进行排名
  • 根据其他列中的开始时间和结束时间计算马拉松选手的比赛时间

计算列的持久性

除非标记为计算列,否则它不会物理存储在表中PERSISTED。

如果它_不是_持久计算列,则每次访问表时都会进行计算。

如果它_是_持久计算列,则计算值物理存储在表中。这意味着,它不需要在每次运行查询时计算其值。如果数据在为其派生其值的列之一中更新,则计算列的值将更新并存储在表中。这有助于提高性能。

请注意,只有确定性的计算列才能持久化。如果它是非确定性的,如果你试图坚持它,你会得到一个错误。

非确定性列是即使输入相同也会返回不同值的列。例如,如果您在计算中使用当前日期,则该值每天都会不同,并且将被认为是不确定的。

如果您只是连接名字和姓氏,那么这将是确定性的,您可以保留这样的列。

创建计算列

您可以从SSMS GUI 或使用Transact-SQL创建计算列。

在 SSMS 中

在 SSMS 中,在Table Designer中,创建您想要作为计算列的列(或者如果它已经存在,则只需选择它),然后在Column Properties选项卡下,将您的公式输入到Computed Column Specification属性字段中。

不要担心给计算列一个数据类型——SQL Server 会根据你的公式给它一个数据类型。

如果你愿意Yes,你也可以选择。Is Persisted

使用 T-SQL

有关使用 Transact-SQL 创建计算列的示例,请参阅使用 T-SQL 在 SQL Server中创建计算列。