指定表中的计算列

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

计算列是虚拟列,并非实际存储在表中,除非此列标记为 PERSISTED。 计算列的表达式可以使用其他列中的数据来计算其所属列的值。 可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中为计算列指定表达式。

限制和局限

  • 计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义,也不能与 NOT NULL 约束定义一起使用。 但是,如果计算列值由具有确定性的表达式定义,并且索引列中允许使用计算结果的数据类型,则可将该列用作索引中的键列,或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。 例如,如果表中包含整数列 a 和 b,则可以对计算列 a + b 创建索引。但不能对计算列 a + DATEPART(dd, GETDATE()) 创建索引,因为在以后的调用中,其值可能发生变化。
  • 计算列不能作为 INSERT 或 UPDATE 语句的目标。
  • 在创建或更改计算列的索引或索引视图时,SET QUOTED_IDENTIFIER 必须为 ON。 有关详细信息,请参阅 SET QUOTED_IDENTIFIER (Transact-SQL)

权限

需要对表的 ALTER 权限。

使用 SQL Server Management Studio

添加新的计算列

  1. “对象资源管理器”中,展开要添加新计算列的表。 右键单击“列”,再选择“新建列”

  2. 输入列名并接受默认数据类型 (nchar(10))。 数据库引擎 通过将数据类型的优先顺序规则应用到在公式中指定的表达式,来确定计算列的数据类型。 例如,如果公式引用一个类型为 money 的列和一个类型为 int的列,则计算列的类型将为 money ,因为该数据类型具有较高优先顺序。 有关详细信息,请参阅数据类型优先级 (Transact-SQL)

  3. “列属性” 选项卡中,展开 “计算所得的列规范” 属性。

  4. 在“(公式)”子属性中,在右侧的网格单元格中输入此列的表达式。 例如,在 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)

  5. 从“持久化”子属性的下拉菜单上选择“是”或“否”,以指示该数据是否持久。

  6. 在“文件”菜单上,选择“保存”以保存表名称。

将计算列定义添加到现有列中

  1. 在“对象资源管理器”中,右键单击该表以及你要对其更改和展开“列”文件夹的列。
  2. 右键单击要为其指定计算列公式的列,然后选择“删除”。 选择“确定”。
  3. 添加一个新列,然后按照前面的步骤添加新计算列以指定新计算列公式。

使用 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;

-- Update values in the table.
UPDATE dbo.Products 
SET UnitPrice = 2.5
WHERE ProductID = 1;

-- Display the rows in the table, and the new values for UnitPrice and InventoryValue.
SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue
FROM dbo.Products;

将新计算列定义添加到现有表中

以下示例向在前一个示例中创建的表添加一个新列。

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);

(可选)添加 PERSISTED 参数,将计算值以物理方式存储到表中:

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5) PERSISTED;

将现有列更改为计算列

以下示例修改在前一个示例中添加的列。

ALTER TABLE dbo.Products DROP COLUMN RetailValue;
GO

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);
GO

后续步骤