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中创建计算列。