SQL SERVER 创建计算列

本文介绍了如何在SQL Server中使用计算列,包括非持久化及持久化计算列的区别。通过示例展示了如何创建计算列以及使用PERSISTED选项来存储计算结果。
在CREATE TABLE或ALTER TABLE语句中定义的列可以源于独立的或者基于列的计算。如果需要在相关查询中对相同的数据重复计算,则计算列就变得很有用。计算列以创建表或修改表的时候定义的表达式为基础,除非使用了PERSISTED关键字,否则计算列不会物理保存在表中。

在这个技巧中,我会给出创建计算列的演示,并且介绍使用SQL Server 2005的PERSISTED选项的方法。通过CREATE或ALTER TABLE增加一个计算列的语法如下:

alert table table_name
add column_name AS computed_column_expression [PERSISTED]

column_name是新列的名字。computed_column_expression是你为了得到列的值而执行的计算。增加PERSISTED关键字能让计算的结果被物理保存。

示例1:
ALTER TABLE Production.TransactionHistory  
ADD CostPerUnit AS (ActualCost/Quantity) 

示例2:
ALTER TABLE Production.TransactionHistory  
ADD CostPerUnit AS (ActualCost/Quantity)  PERSISTED

解析:
第一个示例向Production.TransactionHistory表添加了一个名为CostPerUnit的非持久化列,使它在SELECT查询中能像普通表列那样被引用:
ADD CostPerUnit AS (ActualCost/Quantity) 
计算列不能用DEFAULT或者FOREIGN KEY约束。计算列不能被显式更新或插入(因为它的值都是计算出的)。
计算列能用在索引中,但是一定要符合一些条件。比如是确定的(对于一组给定的输入总是返回相同的结果)和精确的(不包含浮点值)。

第二个示例演示了在CREATE TABLE命令中使用计算列:
AvgSharesPerShareholder AS (SharesOutStanding/Shareholders) PERSISTED 
和第一个示例不同,增加了PERSISTED意味着数据被物理地保存在数据库中。对计算中使用的列进行的任何修改都会引起存储值的再一次更新。但是保存的数据仍然不可以直接修改--数据仍然要经过计算。然而和非持久化的方式不同,保存数据意味着列能用于表分区(请参阅4.7.1节的"实现表分区"技巧)或者非精确(基于浮点)值的索引。
### 在SQL Server创建计算的实现方法 在SQL Server中,计算(Computed Column)是一种基于表中其他的值派生出来的。它可以通过定义表达式来动态计算其值,并且可以选择性地存储这些值。以下是关于如何在SQL Server创建计算的详细说明和示例。 #### 计算的基本语法 计算的定义通常包含在`CREATE TABLE`或`ALTER TABLE`语句中,通过指定一个表达式来定义该的值。以下为创建计算的基本语法[^5]: ```sql CREATE TABLE 表名 ( 1 数据类型 [约束], 2 数据类型 [约束], ... 计算名 AS (表达式) [PERSISTED] ); ``` - `AS (表达式)`:定义计算的逻辑表达式。 - `[PERSISTED]`:可选关键字,用于指示SQL Server计算的值物理存储在表中。如果未指定此关键字,则计算的值将在查询时动态计算。 #### 示例:创建带有计算的表 以下示例展示了一个包含计算的用户表,其中计算`FullName`由`FirstName`和`LastName`组合而成。 ```sql CREATE TABLE Users ( UserID INT PRIMARY KEY, FirstName NVARCHAR(50), LastName NVARCHAR(50), FullName AS (FirstName + ' ' + LastName) PERSISTED ); ``` 在此示例中,`FullName`通过`FirstName`和`LastName`的值进行计算,并且使用了`PERSISTED`关键字以确保其值被物理存储[^6]。 #### 示例:基于数学运算的计算 以下示例展示了一个包含计算的产品表,其中计算`TotalPrice`由`Quantity`和`UnitPrice`相乘得出。 ```sql CREATE TABLE Products ( ProductID INT PRIMARY KEY, Quantity INT, UnitPrice DECIMAL(18, 2), TotalPrice AS (Quantity * UnitPrice) ); ``` 在此示例中,`TotalPrice`通过`Quantity`和`UnitPrice`的值进行计算,但未使用`PERSISTED`关键字,因此其值将在查询时动态计算[^7]。 #### 注意事项 - 如果计算依赖于其他的值,则必须确保这些的数据类型支持所需的运算。 - 使用`PERSISTED`关键字可以提高查询性能,因为它避免了每次查询时重新计算值。然而,这也会增加存储空间的需求[^8]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值