计算列是虚拟列,并非实际存储在表中,除非此列标记为 PERSISTED。 计算列的表达式可以使用其他列中的数据来计算其所属列的值。 您可以通过使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2012 中为计算列指定表达式。
本主题内容
开始之前:
限制和局限
安全性
使用以下工具指定计算列:
SQL Server Management Studio
Transact-SQL
开始之前
限制和局限
计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义,也不能与 NOT NULL 约束定义一起使用。 但是,如果计算列值由具有确定性的表达式定义,并且索引列中允许使用计算结果的数据类型,则可将该列用作索引中的键列,或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。 例如,如果表中包含整数列 a 和 b,则可以对计算列 a + b 创建索引。但不能对计算列 a+DATEPART(dd, GETDATE()) 创建索引,因为在以后的调用中,其值可能发生更改。
计算列不能作为 INSERT 或 UPDATE 语句的目标。
安全性
权限
需要对表的 ALTER 权限。
[返回页首]
使用 SQL Server Management Studio
添加新的计算列
在**“对象资源管理器”中,展开要添加新计算列的表。 右键单击“列”,再选择“新建列”**。
输入列名并接受默认数据类型 (nchar(10))。 数据库引擎通过将数据类型的优先顺序规则应用到在公式中指定的表达式,来确定计算列的数据类型。 例如,如果公式引用一个类型为 money 的列和一个类型为 int 的列,则计算列的类型将为 money,因为该数据类型具有较高优先顺序。 有关详细信息,请参阅数据类型优先级 (Transact-SQL)。
在**“列属性”选项卡中,展开“计算所得的列规范”**属性。
在**“(公式)”**子属性中,在右侧的网格单元格中输入此列的表达式。 例如,在 SalesTotal 列中,您输入的公式可能是 SubTotal+TaxAmt+Freight,它将该值加入到表中每行的这些列中。
重要提示
当两个不同数据类型的表达式用公式组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。 如果此转换不是所支持的隐式转换,则返回错误“Error validating the formula for column column_name.”。 使用 CAST 或 CONVERT 函数解决数据类型冲突。 例如,如果类型为 nvarchar 的列与类型为 int 的列相结合,则整数类型必须转换为 nvarchar,如公式 ('Prod'+CONVERT(nvarchar(23),ProductID)) 中所示。 有关详细信息,请参阅 CAST 和 CONVERT (Transact-SQL)。
从**“是持久的”子属性的下拉菜单上选择“是”或“否”**,以指示该数据是否持久。
在**“文件”菜单上,单击“保存 table name”**。
[返回页首]
将计算列定义添加到现有列中
在**“对象资源管理器”中,右键单击该表以及您要对其更改和展开“列”**文件夹的列。
右键单击您要为其指定计算列公式的列,然后单击**“删除”。 单击“确定”**。
添加一个新列,然后按照前面的步骤添加新计算列以指定新计算列公式。
[返回页首]
使用 Transact-SQL
创建表时添加计算列
连接到数据库引擎。
在标准菜单栏上,单击**“新建查询”**。
将以下示例复制并粘贴到查询窗口中,然后单击**“执行”**。 此示例创建了一个表,其中具有一个计算列,该列将 QtyAvailable 列的值乘以 UnitPrice 列的值。
CREATE TABLE dbo.Products ( ProductID int IDENTITY (1,1) NOT NULL , QtyAvailable smallint , UnitPrice money , InventoryValue AS QtyAvailable * UnitPrice ); -- Insert values into the table. INSERT INTO dbo.Products (QtyAvailable, UnitPrice) VALUES (25, 2.00), (10, 1.5); -- Display the rows in the table. SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue FROM dbo.Products;
将新计算列定义添加到现有表中
连接到数据库引擎。
在标准菜单栏上,单击**“新建查询”**。
将以下示例复制并粘贴到查询窗口中,然后单击**“执行”**。 以下示例向在前一个示例中创建的表添加一个新列。
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.35);
将现有列更改为计算列
连接到数据库引擎。
在标准菜单栏上,单击**“新建查询”**。
若要将现有列更改为计算列,您必须删除后重新创建该计算列。 将以下示例复制并粘贴到查询窗口中,然后单击**“执行”**。 以下示例修改在前一个示例中添加的列。
ALTER TABLE dbo.Products DROP COLUMN RetailValue; GO ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);
有关详细信息,请参阅 ALTER TABLE (Transact-SQL)。
[返回页首]