如何创建一个从另一列计算列?(How do I create column calculated f

2019-08-03 08:16发布

我需要创建一个列age在SQL Server数据库。

此列的值应该基于列的值来计算DOB

同时其值应增加为Age增加而增加。

Answer 1:

您应该使用一个计算列来解决这个问题。 一些与此类似的定义:

ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())

从和可用的更多信息,采取原始语句BlackWasp 。

编辑:

MSDN解释计算列如下:

计算列由能够在同一个表使用其它列的表达式来计算。 该表达式可以是是非计算列名,常数,函数,以及这些的由一个或多个运算符连接的任意组合。 表达不能为子查询。

除非另有规定,计算列是未实际存储在表中的虚拟列。 它们的值重新计算每次在查询中引用的时间。 数据库引擎使用在CREATE TABLE和ALTER TABLE语句的PERSISTED关键字来台物理店面计算列。 当任一列是他们的计算变革的一部分,它们的值被更新。 通过标记计算列的持续存在,你可以创建一个计算列,它是确定的,但不是精确的指标。 此外,如果计算列引用CLR函数,数据库引擎无法验证该功能是否是真正的确定性。 在这种情况下,计算列必须坚持使索引可以在其上创建。 欲了解更多信息,请参阅计算列上创建索引。

计算列在选择列表,WHERE子句,ORDER BY子句,或任何其他地方,其中正则表达式可以用来使用,但下列情况除外:

用作CHECK,外键,或NOT NULL约束计算列必须被标记仍然存在。 计算列可被用作在一个索引或任何PRIMARY KEY或者如果计算列值由确定性表达式并将计算结果的数据类型定义的唯一约束的一部分的键列被允许在索引列。

例如,如果表中有整数列a和b,计算列A + B可以被索引,但在计算列a + DATEPART(DD,GETDATE())不能在以后的调用索引,因为该值可以改变>。

计算列不能作为INSERT或UPDATE语句的目标。

数据库引擎自动确定基于所使用的表达式计算列的为空。 大多数表达式的结果被认为是可空,即使只有不可为空列都存在,因为可能的下溢或溢出会产生无效的结果也是如此。 使用COLUMNPROPERTY函数与AllowsNull财产中任何计算列的为空在表中。 这可为空的表达可以通过指定ISNULL(check_expression,常数),其中常数为任何空结果取代的非空值可以变成非空之一。

来源: MSDN -计算列



Answer 2:

代码片段

ALTER TABLE
    TheTable
ADD
    DOB AS
    CASE
        WHEN
                MONTH(Birth) > MONTH(ISNULL(Death, SYSDATETIME()))
            OR  (
                        MONTH(Birth) = MONTH(ISNULL(Death, SYSDATETIME()))
                    AND DAY(Birth) >= DAY(ISNULL(Death, SYSDATETIME()))
                )
        THEN
            DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME())) - 1
        ELSE
            DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME()))
    END


Answer 3:

与自动生成的列创建表,

CREATE TABLE Person2
(Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50),
DOB date, Age AS DATEDIFF(YEAR, DOB ,GETDATE()) )


Answer 4:

这是让这个时代的正确方法:

alter table <yourtable> add age as datediff(year, DOB, getdate())- case when month(DOB)*32 + day(DOB) > month(getdate()) * 32 + day(getdate()) then 1 else 0 end


文章来源: How do I create column calculated from another column?