在表中指定计算列

计算列是一个虚拟列,除非列标记为 PERSISTED,否则该列不会以物理方式存储在表中。 计算列的表达式可以使用其他列中的数据来计算其所属列的值。 可以使用 SQL Server Management Studio 或 Transact-SQL 为 SQL Server 2014 中的计算列指定表达式。

本主题内容

在您开始之前

局限性与限制

  • 计算列不能用作 DEFAULT 或 FOREIGN KEY 约束条件的定义,也不能用作 NOT NULL 约束条件的定义。 但是,如果计算列值由确定性表达式定义,并且索引列中允许结果的数据类型,则可以将计算列用作索引中的键列或任何 PRIMARY KEY 或 UNIQUE 约束的一部分。 例如,如果表具有 a 和 b 的整数列,则计算列 a + b 可以编制索引,但计算列 A + DATEPART(dd,GETDATE()无法编制索引,因为该值可能会在后续调用中更改。

  • 计算列不能是 INSERT 或 UPDATE 语句的目标。

安全

权限

需要对表具有 ALTER 权限。

使用 SQL Server Management Studio

添加新计算列

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

  2. 输入列名并接受默认数据类型(nchar10)。 数据库引擎 通过将数据类型的优先顺序规则应用到在公式中指定的表达式,来确定计算列的数据类型。 例如,如果公式引用类型 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. 通过从“Is Persisted”子属性的下拉列表中选择“是”还是“否”来指示数据是否持久保存。

  6. 在“文件”菜单上,单击“保存表名称”

向现有列添加计算字段定义

  1. 在“对象资源管理器”中,右键单击该表以及你要对其更改和展开“列”文件夹的列。

  2. 右键单击要为其指定计算列公式的列,然后单击“ 删除”。 单击 “确定”

  3. 添加一个新列,然后按照前面的步骤添加新计算列以指定新计算列公式。

使用 Transact-SQL

创建表时添加计算列

  1. 连接到数据库引擎。

  2. 在标准栏中,单击“新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击“ 执行”。 该示例创建了一个表,其中包含一个计算列,该列将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;  
    
    

将新的计算列添加到现有表

  1. 连接到数据库引擎。

  2. 在标准栏中,单击“新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击“ 执行”。 以下示例向在前一个示例中创建的表添加一个新列。

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

将现有列更改为计算列

  1. 连接到数据库引擎。

  2. 在标准栏中,单击“新建查询”

  3. 若要将现有列更改为计算列,必须删除并重新创建计算列。 将以下示例复制并粘贴到查询窗口中,然后单击“ 执行”。 以下示例修改在前一个示例中添加的列。

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

    有关详细信息,请参阅 ALTER TABLE (Transact-SQL)